HackThisSite - Steganography Mission 6
Challenge
A PNG image is provided. The only hint is
Thank you Leafman. 题目提供了一张 PNG 图片,唯一的提示是Thank you Leafman(感谢 Leafman)。
数据文件在
https://www.hackthissite.org/missions/stego/lvl/stego6.png,是一个
100x100 的 RGBA PNG。
Solution
Step 1: Container
file 只认出这是 100x100 的 8-bit RGBA PNG,共 1965
字节:
1 | $ file stego6.png |
PNG 是块(chunk)结构,先用 pngcheck -v
走一遍每个块:
1 | $ pngcheck -v stego6.png |
结构很干净:IHDR、一个背景色块 bKGD、一个时间戳块 tIME、一个
IDAT、IEND。bKGD 和 tIME
都是普通元数据,没有藏东西。唯一的异常是最后一行:IEND
之后还有数据。
IEND 是 PNG 的结束标记,规范上文件到它就结束。这里 IEND 块结束于偏移
0x751,而文件长 0x7AD,即后面多出 92
字节。pngcheck 把声明结束点之后还有字节直接报告成 ERRORS
DETECTED。
Step 2: Pixel analysis
PNG 隐写的另一条常见路径是把数据写入 IDAT
解码后的像素位平面(LSB)。用 zsteg -a
扫全部通道、全部位平面:
1 | $ zsteg -a stego6.png | tr '\r' '\n' | sed '/^[[:space:]]*$/d' | head -n 12 |
(zsteg -a 的原始输出用 \r 分隔通道,这里用
tr 归一化成每行一个通道再看。)
所有 bN,channel,lsb/msb 位平面要么为空,要么只是
text: ["U" repeated 21 times]
这类单字符重复的噪声(那是图像本身大色块的规律,不是文本),没有一处读出可读字符串。第
2 行 chunk:0:IHDR 是 zsteg 把 IHDR 头字节误认成 Photoshop
色板,与本题无关。zsteg 唯一有效的一行是
extradata:0:IEND 之后的 92
字节额外数据,内容是 Base64 文本。
Step 3: Payload
定位 IEND 块结束的位置,取出后面的字节:
1 | #!/usr/bin/env python3 |