图片隐写
一张图片 png,本质就是一个文件,也就是一串字节,比如我们用记事本来打开一张图片:
可以看到,记事本翻译出了一串乱码,这是为什么呢,因为记录图片信息的字符在 0~255 (0xff)之间,而记事本的翻译方式就是 ASCII 码,自然会有一些乱码和不可见字符被翻译出来。
那么我们可以使用 010 Editor 这个工具,它会忠诚地把这些都表示成 hex 码。
那么正常的 PNG 图片格式大概如下:
| |
PNG Header :89 50 4E 47 0D 0A 1A 0A(0x50 → P,0x4E → N,0x47 → G)
INED:49 45 4E 44(0x49 → I,其他同理)
但是我们可以这样隐藏信息:
| |
图片查看器在 IEND 这里就截止,这样我们就可以隐藏信息了。
[BUUCTF-MISC] 二维码
把图片放进这个 010 Editor 里面,容易发现这个 IEND 后面隐藏的信息:
我选中的蓝色部分就是 PNG 部分。
可以看到有效信息,标灰色的地方 50 4B 03 04 14 00 09 00 翻译出 PK ...,其实就是 ZIP 文件头(50 4B 03 04)。
还有 4number.txt,也就是说这个 PNG 后面藏了 ZIP,ZIP 里面有一个 4number.txt。
我们也可以用 kali 里的 binwalk 工具,自动查找有没有已知的文件格式:
使用 binwalk -e 可以自动解析剥离内部文件,也可以再 010 Editor 中选中相关部分,右键选择 Save Selection 将其保存为相关文件。
随后我们发现这个压缩文件有密码,根据内部文件 4number.txt 合理猜测,该文件密码为四位数字,进行穷举,使用工具 fcrackzip。
fcrackzip 工具
fcrackzip是一款用于破解zip类型压缩文件密码的工具,主要有暴力破解和字典破解两大功能。
暴力破解 -b(brute force),可选字符集 -c:
-c 1:字符集为 0~9。-c a:字符集为 a~z。-c A:字符集为 A~Z。-c !:常见特殊字符。
可选长度 -l,如 -l 4~6 指长度在 4~6 位的密码。
字典攻击 -D,可以在有限的可能的密码中进行爆破,如存在某密码文本薄 passwd.txt,可以用 fcrackzip -D -p passwd.txt -u secret.zip 来爆破文件。
总之,如 fcrackzip -b -c a1 -l 1-6 -u flag.zip,fcrackzip 是一个好用的爆破工具。
常见的 Header
| |
PNG 文件结构与宽高修改
现在拿下图,深入学习 PNG 的图片结构:
可以看到,IHDR 前有四个字节是 IHDR 信息,对于该图是 00 00 00 0D,这代表了该图的 IDAT 数据部分的长度 Length。
比如该图或者常见图,都是 Length (4 bytes) + Type (4 bytes) + Data (n bytes) + CRC (4 bytes) 的结构,那么该图的 Length 是 0xD = 13 bytes,type = IDAT,自 IDAT 往后数 13 个字节,就是 CRC,也就是 B8 1F 82 96(010 中标紫的部分)。
接下来深入 data 部分,一般来讲,data 部分由 Width (4 bytes) + Height (4 bytes) +
