WeChall - Stegano Attachment

Challenge

"You got mail and a nice attachment." — 有一张附件图片,其中隐藏了 12 字母的 session-bound solution。

Solution

挑战页面提供了 attachment.php,下载后是一个 JPEG 图片(221x350)。

JPEG 尾部附着一个 ZIP 文件,其中包含 solution.txt。JPEG 和 ZIP 能共存于同一个文件是因为两者的解析方向不同:

1
2
JPEG:     从头读    → FF D9 后停止(尾部垃圾被忽略)
unzip: 从尾扫 → 找 EOCD 签名 PK\x05\x06 → 定位 ZIP 数据

JPEG 解码器遇到 End of Image marker FF D9 就结束处理,后面的数据不影响图片显示。

unzip 根本不依赖文件扩展名 —— ZIP 格式的 End of Central Directory (EOCD) 记录固定在文件的最后 22 字节unzip 打开文件后: 1. 从尾部往前搜索 EOCD 签名 PK\x05\x06 2. 读取 EOCD 中的中央目录偏移量 3. 跳到偏移量处,找到所有文件条目和压缩数据

所以只要文件尾部附着一个结构完整的 ZIP,unzip 就能识别,无论文件头是什么(JPEG、EXE、PDF 都一样)。man page 也写了自解压 ZIP(exe+ZIP)"as with any other ZIP archive" —— 同一机制。

unzip -l 确认 ZIP 内容:

1
2
3
4
5
6
7
$ unzip -l attachment.jpg
Archive: attachment.jpg
Length Date Time Name
--------- ---------- ----- ----
12 2011-01-08 14:17 solution.txt
--------- -------
12 1 file

直接解压:

1
2
3
$ unzip attachment.jpg
Archive: attachment.jpg
extracting: solution.txt

solution.txt 内容即为答案(session-bound,每用户不同)。