结构

PNG由文件标志和3个以上的数据块构成
文件标志:89 50 4E 47 0D 0A 1A 0A
数据块(chunk)

重点关注IHDR,IDAT,IEND

exif信息

有时信息会藏于exif信息中,右键属性或者使用exiftool等工具查看文件exif信息

HEX数据

直接嵌入

有时信息会以明文或密文形式藏于十六进制数据中,常放于文件尾后
使用winhex或010editor等十六进制数据查看工具获取信息

此处的base64解密即可得到信息

文件头尾

有些图片损坏是由于没有或不正确的文件头尾导致
PNG文件头:89 50 4E 47 0D 0A 1A 0A
png文件尾:49 45 4E 44 AE 42 60 82

宽高修复

IHDR前八个字节中有两个位对应图片宽高信息

修改其值可将图片某部分信息隐藏

IDAT块

IDAT定义:
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,用户就可以很方便的生成PNG图像。

IDAT有固定的长度,并且正常情况下最后一个idat块会比前面短
使用tweakPNG或其他工具可以进行idat块检查

可以看到蓝色边框的idat块属于异常现象,实际上去除本块依然不会影响png图片,将蓝色部分IDAT块数据获取下来,重新补上文件头尾并爆破出正确宽高后可以得到新的一张PNG图片

binwalk|foremost

有些文件可能藏于图片的数据中,例如在图片数据中插入zip文件数据:

binwalk -e 文件名 可以分离文件

颜色信道(常见lsb隐写)

zsteg

zsteg可以检测PNG和BMP图片里的隐写数据。

zsteg -a 文件名查看所有信道内容
zsteg -a 文件名 | grep "flag"若flag直接明文藏于某信道则可以搭配条件查询

stegsolve

stegsolve很强大,可以展示多个颜色信道的图片,也可以查对应的十六进制数据

其他工具

steghide/stegseek

steghide支持多种格式文件,用于查看隐写的内容
steghide extract -sf xxx.png -p 密码

stegseek基于steghide开发,用于暴力破解密码
stegseek xxx.png '字典'(默认使用rockyou.txt)

steghide隐藏文件指令
steghide embed -cf 原文件 -ef 要隐藏的文件 -p 123456

未完待续

参考:
IDAT block小结
PNG文件结构
https://ctf-wiki.org/misc/picture/png/
ctfshow 8神PNG隐写入门(土)赛 WP