CTFshow-Misc入门 图片隐写篇(1-23)
1. 图片隐写基础概念与工具准备图片隐写是CTF比赛中Misc类题目的常见考点简单来说就是把关键信息藏在图片里。就像小时候用柠檬汁在纸上写隐形字一样只不过现在用的是二进制数据。我第一次接触这类题目时连该用什么工具都不知道现在回头看其实掌握几个核心工具就能解决80%的基础题。最常用的三件套是010 Editor十六进制编辑器中的瑞士军刀支持文件结构模板解析Binwalk自动化分析文件嵌入数据的利器ExifTool读取图片元信息的专业工具安装这些工具在Linux下很简单sudo apt install binwalk exiftool wget https://www.sweetscape.com/download/010editor_linux64.tar.gz新手最容易犯的错误是盲目使用工具。有次我拿到题目直接binwalk -e结果把关键数据破坏了。正确的做法应该是先用file命令确认真实文件类型复制备份文件从非破坏性检查开始如strings、exiftool2. 文件结构与基础隐写手法2.1 文件尾追加数据这是最简单的隐写方式就像在信封背面又贴了张便条。用010 Editor打开文件直接滚动到最后往往能看到flag。比如misc5这道题用hex编辑器打开图片在文件末尾发现ctfshow{xxxx}格式的字符串如果显示乱码可以尝试调整编码如从ASCII切到UTF-8进阶技巧是结合dd命令提取隐藏部分dd ifmisc5.png bs1 skip$(( $(stat -c%s misc5.png) - 100 )) | strings2.2 文件头伪装术有些题目会故意修改文件签名Magic Number比如misc2把PNG文件改成.txt后缀。识别这类问题有两个诀窍用file命令检测真实类型查看文件头特征PNG:89 50 4E 47JPG:FF D8 FF E0GIF:47 49 46 38我曾遇到一个bpg格式的题目misc3解决方法是用bpgview工具转换sudo apt install bpg bpgview misc3.bpg3. 元数据隐写实战3.1 Exif信息隐藏图片的Exif就像身份证记录着拍摄设备、时间等信息。misc7这类题目通常有三种解法命令行快速查看exiftool misc7.jpg | grep -i ctf使用在线工具如exif.regex.info用hex编辑器搜索Exif特征码45 78 69 66有个坑点要注意Windows右键属性只能看到部分信息。有次比赛我差点因此错过flag后来用-a参数才显示完整exiftool -a -u -g1 misc7.jpg3.2 特殊字段利用misc18-misc23这组题展示了各种奇葩的元数据位置缩略图misc22用exiftool -b -ThumbnailImage misc22.jpg thumb.jpg注释字段misc20exiftool -Comment misc20.jpg时间戳misc23需要将十进制时间戳转十六进制最麻烦的是misc21这类需要数据转换的题目我的解题脚本如下timestamps [874865822, 2699237688, 2156662245, 460377706] flag .join([hex(t)[2:] for t in timestamps]) print(fctfshow{{{flag}}})4. PNG文件结构深挖4.1 IDAT块魔术PNG的IDAT块存储图像数据但可以玩出很多花样。misc11的解题过程很典型用pngcheck -v misc11.png查看块结构发现异常数量的IDAT块用TweakPNG删除前几个IDAT块保存为新文件后显示隐藏内容更专业的做法是使用Python的zlib模块直接操作import zlib with open(misc11.png,rb) as f: data f.read() # 定位到第二个IDAT块 idat2 data.find(bIDAT, data.find(bIDAT)1) print(zlib.decompress(data[idat24:idat2200]))4.2 CRC爆破技巧当图片尺寸被修改时如misc32可以用CRC值反推原始尺寸。这个脚本我比赛时经常用import zlib, struct def crack_size(filename, crc): with open(filename,rb) as f: data f.read(29) for w in range(1024): for h in range(1024): new_data data[:16] struct.pack(2I,w,h) data[24:] if zlib.crc32(new_data[12:29]) crc: return w,h5. 动态图片隐写分析5.1 GIF帧操作misc37这类题目需要在多帧中找flag推荐使用stegsolve的Frame Browser功能。更高效的方法是命令行处理convert misc37.gif -coalesce frame_%02d.png for i in {09,14,21,31,34}; do strings frame_$i.png | grep ctf; done5.2 时间隐写术misc39利用帧间隔时间存储二进制数据解题步骤提取延迟时间identify -format %T misc39.gif times.txt转换时间值为二进制times open(times.txt).read().split() binary .join([1 if t37 else 0 for t in times])按7位一组转换ASCIIflag .join([chr(int(binary[i*7:(i1)*7],2)) for i in range(len(binary)//7)])6. 实战中的疑难问题解决6.1 异常文件处理遇到misc41这种特殊题目时提示往往藏在细节里。我的处理流程用xxd misc41.jpg | grep F001查找特征值建立坐标映射关系from PIL import Image img Image.new(RGB, (125,8)) for y in range(8): for x in range(125): img.putpixel((x,y), (0,0,0) if has_f001(x,y) else (255,255,255)) img.show()6.2 二进制数据处理misc13这类题目需要处理混合编码数据时这个脚本能救命s 631A74B96685738668AA6F4B77B07B216114655336A5655433346578612534DD38EF66AB35103195381F628237BA6545347C3254647E373A64E465F136FA66F5341E3107321D665438F1333239E9616C7D flag .join([chr(int(s[i:i2],16)) for i in range(0,len(s),4)])7. 文件格式转换技巧7.1 格式转换的妙用misc45教会我们有时候转换文件格式就能解决问题。操作步骤在线转换png到bmp用binwalk分析新文件binwalk -e converted.bmp在提取的目录中找到flag7.2 二进制差异分析当常规方法失效时如misc49可以尝试xxd misc49.jpg | grep FF E | cut -c10-10 | tr -d \n这个命令链实现了十六进制转储过滤特定模式提取关键字节拼接成flag8. 高效解题的实用建议经过几十场CTF比赛我总结出图片隐写的黄金法则先肉眼观察用不同查看器打开图片浏览器、图片编辑器、hex编辑器检查基础信息file miscX strings miscX | grep -i ctf exiftool miscX尝试无损提取binwalk -e miscX foremost miscX分析文件结构使用010 Editor的模板功能考虑数据转换ASCII/Hex/Base64/二进制互相转换最后分享一个真实案例有次比赛我卡在最后一步死活解不出flag。后来发现是把字母o和数字0看混了。所以提醒大家提交前一定要仔细校验每个字符。