恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
BUUCTF刷题记录:CTF Misc方向图片隐写、压缩包与流量分析实战
首页
资讯中心
/
BUUCTF刷题记录:CTF Misc方向图片隐写、压缩包与流量分析实战
BUUCTF刷题记录:CTF Misc方向图片隐写、压缩包与流量分析实战
发布时间:2026/10/19 11:18:55
有人问我CTF里Misc方向到底怎么刷我的回答一直很统一先啃下十篇写得足够啰嗦的WriteUp。这听起来鸡肋但Misc这个分类的特殊性恰恰就在这里——它不像逆向和Pwn那样对底层知识有硬性门槛也不像Web那样需要背海量攻击手法Misc的题目核心就两件事你能不能发现文件里“多出来的东西”以及你知不知道用什么姿势把它还原出来。而这两件事都能从别人的解题过程里最快地偷师。这一篇是BUUCTF刷题记录的Misc系列第二弹挑了图片隐写、压缩包处理、流量分析这几类最有代表性的题目把每一道的完整思路、工具调用、踩坑过程都记录下来。适合刚接触CTF、准备系统性刷Misc的读者也适合赛前临时翻工具清单的老手。我尽量写得细一点不只贴命令还解释为什么要在这一步做这个操作方便你真正理解套路而不是背答案。1. 赛前热身Misc方向的基础认知与工具意识1.1 Misc到底在考什么很多人觉得Misc就是“杂”拼人品、靠运气其实恰恰相反。刷了几十道题之后你会发现Misc的考点高度集中在三个方面识别、还原、转化。识别是第一步拿到一个未知文件你要能判断它到底是什么。比如一个后缀为.png的文件真实文件头却是jpg一个看似正常的文本文件打开之后全是不可见字符一个压缩包解压出来的是一张图片但图片里藏了另一个压缩包。这些都需要在极短时间内完成判断靠的是对文件格式底层的熟悉度而不是什么高深算法。还原是第二步也是最吃经验的部分。题目往往会对文件做手脚PNG的宽高被改小导致图片显示不全、Zip的加密标志位被篡改成伪加密、音频的频谱里混了一段摩斯电码、双图叠加之后才能看到信息。还原的过程本质上是在理解“这个文件格式原本该长什么样”然后反推哪里被改过了。转化是第三步拿到隐藏信息之后不一定直接是flag还可能是base64串、栅栏密码、培根密码、十六进制数甚至是一段坐标。这个环节没有太多捷径见得多自然就敏感了看到一长串等号结尾的字符串能条件反射想到base64看到01组成的矩阵能想到二维码。Misc题目看似“杂”但本质上考察的是对文件格式、编码方式、信息隐藏技巧的综合敏感度。这种敏感度没有速成方法只能通过大量刷题、认真复现别人的WriteUp来积累。1.2 高频工具清单工欲善其事必先利其器。Misc方向没有“一招鲜”的工具每个类别都需要对应工具的组合。我整理了一份高频工具表基本覆盖了这次WriteUp里用到的全部工具也方便你备赛时查漏补缺。工具用途常用场景备注file判断文件真实类型拿到未知文件第一时间Linux自带strings提取文件中的可打印字符串找隐藏文本、base64串加 -n 控制最小长度binwalk检测并提取嵌套文件图片/固件中隐藏压缩包-e 自动提取foremost按文件签名还原文件格式化/损坏文件恢复按类型批量恢复010 Editor十六进制编辑与模板解析查看文件头、修改PNG宽高模板功能一绝StegSolve图片信道分析、双图对比LSB隐写、像素通道提取配合zsteg更佳zsteg自动检测PNG/BMP隐写LSB快速扫描命令行工具Audacity音频频谱/波形分析音频隐写、摩斯电码查看频谱图Wireshark流量包分析HTTP/DNS/ICMP流量导出对象功能常用ARCHPR压缩包密码爆破加密Zip/RAR支持掩码攻击这些工具里binwalk和foremost是“分离型”选手一个靠文件签名检测一个靠暴力扫描恢复StegSolve和zsteg是“像素型”选手专门处理藏在位平面里的信息010 Editor则属于“底层型”选手适合手动改文件字节理解格式本身的容错机制。熟练搭配这三类工具Misc大半题目都在射程范围内。1.3 解题流程的基本思路我个人的做题习惯是先走一遍固定流程再根据题目特性深入。这个流程虽然简单但能帮我避免漏掉最基础的线索。第一步文件类型判断。拿到文件先file看看真实类型和后缀是否相符。不一致则立刻重命名保持一致则继续看文件头和十六进制尾部确认没有追加的额外数据。第二步字符串扫描。strings命令跑一遍重点关注flag、key、base64特征、http链接之类的关键词。这一步往往会直接暴露答案尤其是在图片题里。第三步文件结构检测。用binwalk扫一遍如果检测到压缩包特征就直接分离出来。很多图片题会藏一个zip这一步不能跳过。第四步根据类型深入。如果是图片走通道分析和宽高检查如果是音频看频谱和波形如果是压缩包检查加密标志位和爆破可能如果是流量包优先导出HTTP对象。这套流程看起来简单但实际做题时能帮你省掉大量盲目尝试。我见过太多人拿到一张图片就直接上StegSolve翻半天结果跑完strings就已经看到flag了。做题顺序不能乱先易后难先整体后细节永远是最优解。2. 图片隐写从文件头到像素层的逐层剥离2.1 第一题PNG宽高被篡改与CRC校验还原这是一个非常经典的图片隐写题型。某道题拿到的图片后缀是png用图片查看器打开显示为一张非常窄的细长条看起来完全不像正常图片但文件又在播放器里能正常“解密”出来。这种情况十有八九是PNG的宽度或高度字段被修改了。先用file命令确认file 题目.png输出显示确实是PNG。然后把图片拖进010 EditorPNG文件结构很规律开头是8字节签名89 50 4E 47 0D 0A 1A 0A接着就是IHDR数据块。IHDR块里面前四个字节是宽后四个字节是高的值。我打开之后看到IHDR区段的十六进制内容00 00 01 00对应宽25600 00 00 01对应高1。这明显不合理一张正常图片高度不可能只有1像素。改宽度这个操作很好理解但怎么确定正确的高度这里就要用到PNG的CRC校验机制了。PNG的每个数据块末尾都有一个CRC32校验值它是由该块的类型字段和数据字段计算出来的。如果图片原本是完整创建的那么修改宽度或高度之后CRC校验值就会变得不匹配图片打开时就会出现错误提示。更关键的是这个CRC值是固定存放在文件里的原始值我们可以利用它反推出正确的高度。写一个简单的Python脚本遍历可能的高度值拼接后计算CRC与文件里存的值比对匹配的那一个就是原始高度import struct import zlib def fix_png_height(path): with open(path, rb) as f: data f.read() # IHDR块起点PNG签名8字节后 ihdr_begin 8 # 跳过长度4字节和IHDR类型4字节 data_start ihdr_begin 8 # 读取原始宽、高 width struct.unpack(I, data[data_start:data_start4])[0] orig_height struct.unpack(I, data[data_start4:data_start8])[0] # 读取存储的CRC值IHDR块末尾4字节 stored_crc struct.unpack(I, data[data_start17:data_start21])[0] # IHDR的CRC计算范围是类型字段数据字段即从IHDR到interlace共17字节 crc_base data[data_start-4:data_start13] for h in range(1, 5000): new_data data[:data_start] struct.pack(I, width) struct.pack(I, h) data[data_start8:data_start13] crc zlib.crc32(crc_base[:4] struct.pack(I, width) struct.pack(I, h) crc_base[12:]) if crc stored_crc: print(fCRC匹配正确高度为: {h}) # 修复文件 fixed data[:data_start4] struct.pack(I, h) data[data_start8:] with open(fixed.png, wb) as fw: fw.write(fixed) return h print(未找到匹配高度) fix_png_height(题目.png)运行之后很快就匹配到了正确高度修改保存重新打开图片完整的二维码出现了扫码得到了flag。这道题的核心经验是CRC校验值既是一个“保护机制”也是一个“还原指针”。它本来是为了检测文件完整性但在CTF里恰恰因为它存了原始值反而成了我们还原被篡改字段的抓手。类似的题目还会改成篡改宽度、篡改IHDR里的其他字段思路完全一致。操作完之后我习惯再用pngcheck命令验证一下修复结果确保文件结构没有二次损坏减少后续扫码或者其他工具解析时报错的可能性。这个小习惯在批量修复多张图片时会特别有用。2.2 第二题LSB隐写与多通道信息提取另一类高频图片隐写是LSB隐写。LSB全称是Least Significant Bit也就是最低有效位。在24位真彩色的BMP、PNG图片里每个像素由红、绿、蓝三个颜色通道组成每个通道占8位。修改每通道最低的1位肉眼完全无法察觉颜色的差异但信息就藏在这些最低位里。做题时文件结构和字符串扫描都没有异常binwalk也没有分离出任何嵌套文件这时候就要考虑像素级隐写了。用StegSolve打开图片选择菜单里的Analyse - Data Extract在Bit Planes选择面板里面尝试勾选不同通道的位平面然后点击Preview查看输出结果。实际操作中我一般优先勾选RGB三个通道的0位最低位也就是红色通道的第0位、绿色通道的第0位、蓝色通道的第0位然后选择按行提取或者按列提取。如果图片里藏了文本信息预览区域通常会出现规律的文字或者可辨识的字符如果藏的是二维码预览区域会显示出一张有规律的矩阵图。也可以直接用命令行工具zsteg一条命令扫完所有可能zsteg -a 题目.png-a参数表示自动尝试所有通道组合和所有位提取方式输出包含所有检测到的隐藏数据结果。实测下来这个工具对于PNG和BMP的LSB检测准确率很高能够省掉StegSolve的手动点击过程。不过要注意有些题目不只是LSB隐写还会对信息做二次加密或编码。比如从LSB位平面提取出的数据是一串十六进制、base64或加密文本这时候还需要后续解码。所以每次提取得到结果之后先看输出形态再决定下一步怎么处理。遇到图片隐写我自己的判断顺序是文件层binwalk/strings→ 像素层StegSolve/zsteg→ 结构层宽高篡改/CRC校验→ 格式层双图对比/隐藏通道。虽然不保证100%覆盖所有题目但至少能覆盖Misc图片题里90%以上的出题套路。2.3 图片题的实际操作心得我做完这批图片隐写题之后总结出几个特别实用的经验。一个是看到图片不要急着用看图工具打开正常浏览先跑一遍strings再决定要不要“看图”很多flag明文就藏在图片的元数据或者附加数据里直接strings就出来了根本不需要复杂的隐写还原。第二个经验是修改PNG宽高先看CRC匹配不要盲目猜高度。有些新手会直接把高度改成和宽度一样的数值然后尝试打开看效果但这样成功概率很低。因为PNG的CRC校验就是用来防篡改的错误的高度会导致整个文件解析失败正确做法是上面那样用CRC反推。第三个经验是StegSolve的Colour Inversion功能也值得一试。有些题目会把黑底白字的二维码反色处理导致扫码失败用这个功能反转一下颜色就能正常识别。还有Stereogram Solver功能用于解决立体单击图Magic Eye类型的隐写偶尔会遇到知道在哪操作就不会手足无措。最后保存提取出来的数据时建议直接用.bin后缀不要想当然加.txt。因为提取出的数据可能是图片、压缩包、二维码或者二进制数据先保存再按真实类型打开能避免因为后缀错误导致工具无法识别。3. 压缩包处理伪加密、密码爆破与文件分离3.1 伪加密的识别与修复Misc方向对压缩包的考察非常频繁。最常见的坑就是伪加密Fake Encryption。伪加密是指压缩包本身没有真正加密只是加密标志位被篡改了导致用常规方式解压时要求输入密码但实际上根本不需要密码。识别伪加密的方法很简单。将一个Zip文件拖进010 Editor查找文件头中的通用位标记字段General Purpose Bit Flag。这个字段位于每个文件压缩头里偏移位置在文件头签名50 4B 03 04之后第6个字节。正常加密的Zip该字段的低位置位是09 00未加密则是00 00。如果看到09 00但解压时提示密码错误而且用暴力破解工具也试不出来——大概率就是伪加密。修复时直接把这个字段从09 00改成00 00保存。再尝试解压文件直接被解密出来了原来里面藏着一张图片。需要注意的是Zip文件结构里不仅有文件头还有中央目录记录头中央目录里也有一份对应的加密标志位。有的伪加密题目只改了文件头有的两个都改了所以修改时要检查完整文件里所有出现加密标志的地方统一改成00 00这样才能彻底解除伪加密。也可以用现成的小工具ZipCenOp.jar一条命令自动修复伪加密。但我个人更推荐手动修改因为顺手能观察文件结构以后遇到更复杂的压缩包问题会有更强的直觉。3.2 加密压缩包的密码爆破策略对于真正加密的压缩包爆破是常用手段。ARCHPR是Misc圈子里使用率最高的爆破工具支持暴力破解、掩码攻击和字典攻击。界面比较古老但功能稳定实测爆破小范围密码很好用。使用ARCHPR时要关注的选项主要是攻击类型和字符集范围。如果题目提示压缩包密码是纯数字选择暴力破解并设置数字范围长度从小往大尝试比如先试4位再试6位如果密码中有字母就勾选小写字母或大写字母如果不确定密码格式最简单的是直接跑全字符集暴力破解但耗时成倍增长。掩码攻击值得特别提一下。如果题目暗示密码格式比如“4位数字一个小写字母”爆破范围会大幅缩小。ARCHPR的掩码语法里?d表示数字?l表示小写字母?s表示符号。在掩码栏输入?d?d?d?d?l软件就只会在该格式范围内尝试几分钟内就能跑完。暴力破解慢是新手最常抱怨的问题。其实聪明的做法是先分析线索不要盲目全字符集爆破。压缩包文件名、题目描述、图片里的字符串都可能藏密码提示。比如这道题的压缩包里有个文件名是提示说密码是某年份直接试四位数字半分钟就出来了。3.3 binwalk和foremost分离嵌套文件另一类高发的压缩包题型是把压缩包藏进图片、音频甚至另一个文件里。处理这种嵌套文件binwalk是首选工具。使用方式很简单binwalk 题目.png扫描输出会显示图片中检测到的所有文件签名和偏移量如果出现Zip或RAR的签名直接执行binwalk -e 题目.png-e参数会按照文件签名自动提取所有嵌套文件提取结果通常存放在以图片名为前缀的文件夹里。分离出来的压缩包可能还有密码或者又嵌套了一层文件继续顺着结构去处理就行。foremost是另一个配合工具和binwalk不同的地方在于它更像“按类型扫描还原”无论文件是否连续存储只要在数据流中找到匹配的文件头就会尝试把整个文件切出来。它的典型使用场景是文件系统损坏、数据碎片化或者标题图片里被塞了多个内容不同、位置错落的文件。实际操作中这两个工具一起用效果最好。先用binwalk看整体结构再用foremost做补充提取能有效避免漏掉藏在文件间隙里的隐藏数据。有一个坑必须提醒binwalk对某些包含大量数据压缩的图片会产生误报比如把正常的图像压缩流误判成某种存档类型。这时候不能盲目提取要根据扫描结果里的偏移量和文件大小做二次判断对比图片原始文件大小再决定是否处理。4. 流量分析在协议细节里找Flag4.1 HTTP流量中的快速目标锁定流量分析题在Misc里占比不小核心思路是在Wireshark打开的pcapng文件里从网络协议的角度找出隐藏信息。这类题目最友好的是HTTP流量因为信息通常以明文形式直接挂在请求或响应里。第一步打开流量包之后先看统计 - 协议分级了解整个流量包由哪些协议组成、占比如何。如果HTTP流量占比很高那基本可以锁定看HTTP。然后使用文件 - 导出对象 - HTTP把流经的所有HTTP对象下载保存。很多题目的flag就藏在这导出的HTML、图片、压缩包文件里。第二步是跟踪HTTP流。右键选中任意一条HTTP请求记录选择追踪流 - HTTP流可以看到客户端和服务器的完整对话包括请求头、响应头、响应体有时候上传下载的文件也会以文本形式直接出现在流里。这里有一个高频坑流量包里通常有大量HTTP请求但只有某一条关键请求里才有flag。盲目翻会很累要学会用筛选条件缩小范围。比如流量包里暴露出来的域名、路径关键词或者文件名提示都可以在Wireshark的过滤栏里用http.request.uri contains flag、http.host 某域名之类的语法过滤快速定位可疑请求。4.2 非HTTP协议的隐藏隧道流量分析题不总是一眼能看出目标的。比较考验经验的题型是隐藏隧道类常见的是DNS隧道和ICMP隧道。DNS隧道的基本特征是大量DNS查询请求里的子域名部分包含有规律的字符串正常场景下DNS查询的域名都是固定的而隧道则会用随机子域名或者按组编码的子域名。处理方法是用Wireshark过滤出DNS协议流量按时间排序然后提取每个查询域名里可疑字段一般是第一个点号之前的部分将这些字符串拼接起来再做一次解码很可能就是编码后的数据。ICMP隧道也常见。正常的ICMP协议是网络连通性测试用的ping请求和应答数据量都很小。但如果流量包里有大量ICMP包而且echo request的data字段内容很长那就很不正常。把整个流量包过滤成icmp然后追踪一个完整的ICMP流查看data字段部分经常直接能看到明文数据或者需要进一步去编码拼接。处理隧道类流量核心是违背直觉不要只盯着TCP和UDP这种常见端口反而要看DNS、ICMP这类日常不会被注意的协议。因为流量分析题的考点就在“反常”二字哪个协议的数据分布最不合理哪里就藏着答案。4.3 Wireshark追踪流的实用技巧做流量分析题Wireshark的几个快捷键和操作位置值得记住。右键任意一条记录选择追踪流 - TCP流会跳出来一个新窗口展示完整会话数据。窗口底部可以切换数据展示方式默认是ASCII码适合看明文文本如果数据是二进制可以切到Hex Dump模式十六进制和ASCII对照看更容易发现格式特征如果要保存原始数据直接在右上角选择“原始数据”保存。这个保存功能非常实用能够直接提取隐藏在流量传输过程中的文件避免丢内容。另一个常用操作是统计 - 对话和统计 - 节点用来定位与哪个IP地址的通信最频繁。如果某个IP地址跟本机有大量数据交互而且大小明显异常往往就是攻击者或数据传输集中点把过滤条件设成ip.addr 目标IP就只盯着这一对通信看。流量题的难点不在会软件操作而在于面对几百MB甚至几个GB的pcap文件时不慌乱、不漫无目的地翻。第一件事永远是统计协议占比第二件事是找异常点第三件事才是深入细节。按照这个顺序来既不浪费多的时间也几乎不会漏线索。5. 常见问题排查与实战心得5.1 做题卡壳时的五类高频原因同样是刷Misc题有时候一卡就是半小时。我复盘了一下自己的卡壳记录发现有五类原因出现频率最高。第一类是字符串扫描不够细心。很多题目其实在strings输出里已经给出了关键线索只是因为字符串太长、夹杂在大量无关内容里没有第一眼注意到。解决办法是养成习惯strings命令加上-n 8参数只打印长度不低于8的字符串过滤掉大量短碎片。想更省事的话把输出重定向到文本文件里再配合grep搜索关键词比如grep -i flag、grep -i http。第二类是工具选择错误。比如用StegSolve去处理JPEG图片的隐写效果就很差因为JPEG的隐写原理和PNG完全不同通常藏在DCT系数里要用的工具是StegHide或者F5隐写的检测脚本。工具不对再努力也是白费。做题前先判断文件类型再决定工具链别上来就开StegSolve。第三类是编码识别错误。提取得到的数据如果是十六进制肉眼看到的是一长串数字和abcdef虽然base64也能包含这些字符但正确做法是先看字符集范围。十六进制串里只会有0-9和a-fbase64则包含大小写字母、数字和/,。判断准了再解码能少走很多弯路。第四类是伪加密和真加密搞混。拿到加密压缩包就盲目上ARCHPR爆破结果跑了大量时间还没出结果结果早知道是伪加密改个标志位就解开了。识别伪加密的经验是爆破工具的字典模式跑得很快却没任何命中十有八九是伪加密。第五类是流量分析不排序。在流量包里看到一堆数据直接点击流跟踪翻到一个较长的就认为是答案。其实正确步骤是先统计协议占比再用追踪流 - TCP流逐个翻看并且每次翻流都注意右下角的流编号Stream避免跳流错失线索。5.2 我的排查顺序清单把上面的内容整理一下我每次做题卡住时都会按这个顺序过一遍重新file和strings加粗排查短字符串和隐藏关键词binwalk和foremost分离检查是否嵌套其他文件如果是图片StegSolvezsteg双重复查如果是压缩包检查加密标志位再考虑爆破如果是流量先统计协议再逐个追踪流所有提取数据统一保存为.bin后缀再判断真实类型对提取的数据做编码识别和格式识别再决定解码方式这个顺序看起来有点机械但Misc方向本身就是“经验套路”的学科稳定的流程比灵感重要得多。按顺序走一遍大多数题目都能在几分钟内发现关键线索。写完这批WriteUp我的感触是Misc方向并非只能靠题海战术更有价值的其实是总结题材规律和工具用法。同一道题第一次做可能花半小时但理解了它背后的“隐藏手段”之后再做十道类似的题都能在五分钟内解决。如果你刚开始刷Misc建议每做完一道题都回头记一下这道题用到了哪些工具、哪些判定特征把它变成自己头脑里的一张“工具触发表”。下次再遇到类似文件一眼就知道该往哪个方向处理效率会提升得非常明显。