1. 初识隐写术当图片不只是图片第一次接触CTF比赛中的隐写术题目时我盯着那张看似普通的JPG图片看了足足十分钟。它就像一张再正常不过的风景照直到我用StegSolve打开它才发现原来图片可以成为完美的藏宝图。这种将信息隐藏在普通文件中的技术我们称之为隐写术(Steganography)它和加密技术最大的区别在于加密是让信息变得不可读而隐写是让信息变得不可见。在BUUCTF这类CTF比赛中Misc杂项题目经常会用到这种技术。我记得有一次比赛题目给了一张爱因斯坦的照片表面看起来就是普通的肖像但最后却在里面找到了完整的压缩包和flag。这种套娃式的设计在CTF中非常常见——你以为你在解一道隐写题实际上它可能还结合了压缩包破解、文件格式分析等多个知识点。2. 侦察阶段发现隐藏的蛛丝马迹2.1 文件格式分析拿到题目文件后我通常会先用file命令做个快速检查file misc.jpg这个简单的命令有时就能发现猫腻比如文件实际是PNG却被伪装成JPG。但更常见的情况是我们需要用专门的工具深入分析。StegSolve是我最常用的工具之一它的File Format视图能显示文件十六进制数据。有一次我就是在查看十六进制时突然注意到连续的50 4B 03 04——这是ZIP文件的魔数头(Magic Number)专业术语叫PK头因为PK是ZIP发明者Phil Katz的缩写。就像侦探发现指纹一样这个特征值直接暴露了隐藏的压缩包。2.2 自动化工具扫描当手动分析没有收获时我会祭出binwalk这把瑞士军刀binwalk misc.jpg这个命令会自动化扫描文件结构。记得有次比赛binwalk输出显示DECIMAL HEXADESC RIPTION -------------------------------------------------- 0 0x0 JPEG image data, JFIF standard 1.01 138342 0x21C66 Zip archive data, encrypted at least v2.0 to extract这明确告诉我们在138342字节偏移量处藏着一个加密的ZIP。但binwalk有时会漏报所以我通常会加上-e参数尝试直接提取binwalk -e misc.jpg3. 提取阶段分离隐藏文件3.1 使用foremost精准提取当binwalk提取失败时foremost是更好的选择。它基于文件头尾特征进行提取成功率更高。操作步骤是rm -rf output # 先清理旧输出目录 foremost -i misc.jpg -o output完成后查看output目录通常会有个zip子目录。我遇到过foremost提取的ZIP损坏的情况这时可以尝试用-T参数指定文件类型foremost -T -i misc.jpg -o output3.2 手动DD提取在极端情况下当自动工具都失效时我会用dd命令手动提取。比如已知ZIP从138342字节开始dd ifmisc.jpg ofhidden.zip bs1 skip138342这个命令像手术刀一样精准但需要提前知道精确偏移量。有一次比赛我就是用这个方法配合hexedit手动修复了损坏的文件头才成功提取。4. 破解阶段突破加密防线4.1 密码寻找技巧提取出加密ZIP后80%的情况下密码就藏在图片里。我常用的方法有用strings命令搜索可读字符串strings misc.jpg | grep -i password用StegSolve的Frame Browser逐帧查看检查图片元数据exiftool misc.jpg记得有次比赛密码竟然藏在图片的LSB(最低有效位)隐写中需要用StegSolve的Data Extract功能选择RGB的LSB first才能看到。4.2 暴力破解实战当实在找不到密码时fcrackzip是最后的武器。我最常用的暴力破解命令是fcrackzip -b -c aA1! -l 4-6 -u hidden.zip参数说明-b暴力破解模式-c aA1!指定字符集小写、大写、数字、符号-l 4-6尝试4到6位长度密码-u用unzip验证密码有效性如果知道密码可能是字典中的单词可以用fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u hidden.zip在性能较好的机器上我通常会开多个终端并行跑不同长度的密码。5. 经验总结与避坑指南经过多次实战我整理了几个关键点文件备份操作前先cp misc.jpg misc.bak.jpg有次我不小心用vim打开图片文件导致文件头损坏幸亏有备份工具组合没有万能工具我通常会按file→binwalk→foremost→dd的顺序逐步深入密码策略CTF中的密码通常是可见字符串优先尝试图片中出现的文字比如this_is_not_password这种反话可能就是真密码错误处理当foremost报错时尝试删除output目录再运行遇到ZIP损坏可以尝试zip -FF hidden.zip --out fixed.zip有一次特别难忘的经历题目给的图片在StegSolve中能看到PK头但binwalk和foremost都提取失败。最后发现是因为出题人把ZIP数据分散存储在了图片的多个位置需要手动拼接。这种非常规操作提醒我工具不是万能的理解原理才是关键。隐写术就像数字世界的寻宝游戏每张图片背后都可能藏着意想不到的秘密。从最初的毫无头绪到现在能系统性地分析我最大的体会是耐心和细致比技术更重要。有时候flag就藏在最显眼的位置只是我们把它想得太复杂了。