exif信息

拿到一个图片时,建议查看一下它的exif信息,可能会有意想不到的收获,出题人经常在图片exif的信息中藏flag或提示信息。

https://exif.tuchong.com/

stegsolve和lsb隐写

Stegsolve是常用的工具,功能十分强大

用stegsolve打开图片后,建议先把图层看一遍,可能会有flag或者提示信息、二维码之类的东西

如果是gif图片,可以使用frame browser查看使用帧或者有网站查看帧

https://tu.sioe.cn/gj/fenjie/

lsb隐写:在翻看图层的时候,可能会发现lsb隐写的痕迹,使用stegsolve的data extract,选上对应的通道,就可以得到隐藏的信息。

LSB隐写加密,GitHub上面有相关的加解密脚本(但这个项目是基于python2的,使用时需注意自己的python版本)

https://github.com/livz/cloacked-pixel

运行的命令为:

1
2
加密
python2 lsb.py hide 图片名 要隐藏进去的文件 密码
1
2
解密
python2 lsb.py extract 被加密的图片 保存的文件 密码

zsteg(lsb)

kali安装:

1
gem install zsteg

使用方法:

1
2
zsteg 图片
zsteg -a 图片

OurSecret

出题人一般会给提示,比如我们的秘密是绿色的,其中秘密英文是Secret就是在暗示这个工具

使用 在UNHIDE 中打开文件 输入密码 再点击Unhide就好了

##S-Tools

打开之后,把要解密的图片拖进去,然后右键Reveal输入密码就可以得到隐藏文件了

##Jphswin.exe

点击open jpeg 打开图片 点击seek,如果有密码就输密码,没有就直接回车

Free_File_Camouflage

不太常见的一个工具

  1. 解密图片的位置
  2. 如果有密码的话就勾选,然后输密码,没有就跳过
  3. 解出文件的放置位置

##F5-steganography(F5隐写,需要密码)

kali中进行安装

1
git clone https://github.com/matthewgao/F5-steganography

进入F5-steganography 文件夹后,打开终端

解密

1
java Extract 加密过的图片 -p 密码

运行后会在文件夹里生成一个output.txt,打开即可

加密

1
java Embed 原图 生成图 -e 隐藏的文件.txt -p 密码

outguess(可需要password)

kali安装 先下载

1
git clone https://github.com/crovick/outguess

然后进入outguess文件夹,打开终端输入 ./configure&&make&&make install

成功之后即可

使用:进入文件夹后打开终端

加密

1
2
outguess -k 密码 -d hidden.txt 1.jpg 2.jpg
#hidden.txt是要隐写的内容,运行后1.jpg会覆盖2.jpg

解密

1
2
outguess -k 密码 -r 2.jpg out.txt
outguess -r 2.jpg out.txt #不用密码的情况

steghide

kali 中的安装:sudo apt-get install steghide

加密

1
steghide embed -cf out.jpg -ef flag.txt [-p 密码]

把flag.txt隐写到out.jpg中,如果要添加密码,尾部要接上 -p 密码

解密

1
2
3
steghide info out.jpg #查看图片中嵌入的文件信息
steghide extract -sf out.jpg -p 密码
steghide extract -sf out.jpg

16进制查看软件及文件头修复加宽高爆破

推荐010Editor 和winhex

010Editor安装:https://www.sweetscape.com/download/010editor/

修改图片宽高

png

很多时候,所给图片的宽高,甚至crc32校验值都是被修改过的,需要我们去爆破得到正确的值,png图片修改宽高还是很容易的,这里是png.bt模板,框中的值分别为宽高crc值,这里修改之后保存即可

对于png,一般情况下,是把高度改大,看下面有没有内容

jpg

运用jpg.bt,可以很方便的修改jpg的宽高

对于jpg,一般情况下也是把高度改大,能看到图片下面的内容

gif

整体和前两种差不多,借助gif.bt,这里比较特殊的是,每一帧都有独立的宽高,因为不知道flag藏在哪一帧,一般建议把所有帧的高度都改大,然后用Stegsolve打开,翻看每一帧图片。

bmp

借助bmp.bt,整体和前面差不多,当宽高错误时,图片显示很乱

爆破脚本

png图片,已知正确的IHDR块的CRC值时,爆破宽度和高度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import zlib
import struct
# 同时爆破宽度和高度
filename = "misc32.png"
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
#替换成图片的crc
if crc32result == 0xE14A4C0B:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))

png图片,如果IHDR块的CRC的值被修改过,那就直接爆破,运行后会生成很多个图片,看一下哪个是正常的就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#这里是已知高度的情况下爆破宽度,根据自己的需要修改脚本
import zlib
import struct
filename = "misc34.png"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[16:20]
#h = all_b[20:24]
for i in range(901,1200): #界定宽度的范围
name = str(i) + ".png"
f1 = open(name,"wb")
im = all_b[:16]+struct.pack('>i',i)+all_b[20:]
f1.write(im)
f1.close()

jpg图片,已知高度,爆破宽度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#如果跑出来的图片看不到想要的东西,可能是狗出题人把原本的高度调小了,可以试一下把高度改大,再跑一遍试试
import zlib
import struct
filename = "misc35.jpg"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[159:161]
#h = all_b[157:159]
for i in range(901,1200): #界定宽度范围
name = str(i) + ".jpg"
f1 = open(name,"wb")
im = all_b[:159]+struct.pack('>h',i)+all_b[161:]
f1.write(im)
f1.close()

gif图片,已知高度爆破宽度

1
2
3
4
5
6
7
8
9
10
11
12
#如果跑出来没东西,试试把高度改高
import zlib
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
all_b = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
f1.write(im)
f1.close()

查看文件的字节

使用010editor和winhex对文件进行分析

分析文件头文件尾

文件类型 文件头 文件尾 特征
JPEG (jpg) FFD8FFE000104A464946 FF D9 ÿØÿà
PNG (png) 89504E47 AE 42 60 82 PNG
GIF (gif) 47494638 47494638 GIF89a
ZIP Archive (zip) 504B0304 50 4B PK..
TIFF (tif) 49492A00
(bmp) 424D BM
RAR Archive (rar) 52617221 Rar!…
Wave (wav) 57415645
7Z 377ABCAF271C 7z¼¯

webstego解密

链接:https://pan.baidu.com/s/1mRvHQURAQbFJmvvglAFjLg

提取码:nail

img

encode是加密

decode是解密

盲水印

普通双图盲水印

项目地址:https://github.com/chishaxie/BlindWaterMark

具体安装过程自行百度

使用:

加密

1
2
3
python2 bwm.py encode 1.png water.png 2.png #PY2

python3 bwmforpy3.py encode 1.png water.png 2.png #PY3

解密

1
2
3
python2 bwm.py decode 1.png 2.png out.png  #PY2

python3 bwmforpy3.py decode 1.png 2.png out.png #PY3

py2和py3的算法不一样,得到的out.png清晰度也不一样,建议都试一下

也可以加–alpha参数 可能会使图片更清晰

1
python3 bwmforpy3.py decode 1.png 2.png out.png --alpha 10 #PY3