我开始刷Bugku的杂项题是从一次校内的CTF招新赛被吊打之后。那场比赛其它方向我都勉强能动两下唯独杂项题全军覆没——图片里藏了东西看不出来给了个压缩包不知道密码抓了段流量不知道该看哪里。后来朋友说你这种水平去把Bugku的杂项题库从签到题开始刷一遍比看十篇教程都管用。于是就有了这篇整理。这篇东西不是单纯把做过的题贴一遍答案而是按题型维度重新拆解每种题考的能力是什么用什么工具按什么顺序判断常见坑在哪以及我从中学到了什么。如果你也是CTF新手、想系统性补一补杂项的基础或者比赛完之后想复盘自己的思路盲区这篇文章应该能帮你省掉不少瞎试的时间。1. 刷题前的准备课杂项到底在考什么1.1 从一道签到题看杂项的基本盘Bugku杂项的起始题基本都是一道签到题有些甚至不需要任何工具直接打开文件就能看到一串字符串。我当时只觉得这题侮辱智商后来才明白它是整套方法论的第一课——拿到未知文件第一件事永远是先看再动而不是急着往某个工具里塞。杂项这个分类在CTF里边界很模糊它把其它方向不爱收的题全收了图片隐写、音频隐写、文件分析、编码转换、流量包、压缩包密码、随机数预测、甚至脑筋急转弯。但不管题目外壳怎么变底层逻辑高度一致——信息始终存在只是被某种方式隐藏或改写了你需要靠文件格式知识、编码特征、数据分析把它还原出来。所以杂项真正考的不是某一个孤立知识点而是一套信息还原的能力。你需要知道常见文件格式的标准结构是什么样熟悉常见编码的特征前缀能在貌似正常的文件里发现细微异常。这三点没有哪一项是刷一两道题就能补上的都是需要靠大量题目喂出来的手感。1.2 环境准备我最终留下的工具箱很多新手的第一反应是问杂项要用什么工具我的经验是工具不要贪多先把一套稳定的环境用熟比装一堆插件但每个都一知半解强得多。我自己最终稳定用来解题的是下面这套。用途工具切入点文件类型识别file任何未知文件先跑一遍明文字符串提取strings直接从二进制里捞可见文本隐藏文件分离binwalk/foremost图片等载体里是否嵌着其它数据元数据查看exiftoolEXIF信息是最常被忽略的藏身处图片通道检查StegsolveLSB隐写、通道位平面比对压缩包结构查看zipinfo/ 010 Editor伪加密、文件头异常流量分析Wireshark看包、跟流、导出对象编码与脚本处理Python3大部分转换与解密需要自己写脚本音频分析Audacity频谱图、波形对比环境上我建议直接装Kali或者装一个带齐这些工具的虚拟机。不是说Windows不行而是Kali里binwalk、foremost、hashcat、john这些工具都是现成的少折腾很多依赖问题。平时我会在VS Code里配一个Python环境因为杂项题一旦需要脚本化处理基本上几十行代码就能解决大部分解码、异或、拆包的任务。1.3 一条通用解题流水线下面这套流程我花了很久才固化成习惯它帮我避免了很多瞎猜、瞎试的弯路你可以直接抄走file unknown_file strings unknown_file xxd unknown_file | head -20 binwalk unknown_file先用file确认文件真实类型。很多题会故意把文件名改成 .png 或 .txt但真实内容完全不是那么回事。用strings快速过一遍可见字符重点看有没有形如 flag{...} 或者 base64 特征的字符串。有时候题就这么简单明文直接给你。用十六进制查看文件头确认文件头与真实类型是否一致。JPEG 以 FFD8FF 开头PNG 以 89504E47 开头ZIP 以 504B 开头这类特征要背熟。用 binwalk 扫描看载体文件里有没有嵌入其它文件。以上都查不出东西再考虑隐写手段图片走 Stegsolve 通道检查音频走频谱分析流量包走 Wireshark。遇到密码或加密优先翻遍所有线索字符串和元数据最后才轮到爆破。这套流程的顺序是有讲究的先做便宜的检查再做昂贵的分析先看明文再上工具先怀疑结构问题再怀疑加密问题。不是因为后面的手段更高级而是因为多数题目在早期步骤就能出答案而且早期放过的细节往往就是后面最关键的判断依据。2. 图片隐写从通道剥离到文件拼接图片是杂项题里出现频率最高的载体值得单独拆开仔细讲。我这里把我在Bugku上反复遇到的三种图片套路展开说一下。2.1 LSB隐写与Stegsolve的逐通道检查LSB隐写Least Significant Bit最低有效位是图片隐写里最常见的思路。原理一句话就能说清每个像素的RGB通道数值取出来后其最低位bit0对整个图片的视觉影响极小于是可以把要隐藏的信息按位写入这些位置人眼完全察觉不到。用Stegsolve解题时操作路径是打开图片后用左右箭头逐帧切换RGB各通道的bit位平面。当你切到藏了信息的位平面时画面上会出现明显的花纹、文字或者一条横带。这时候再用Analyse里的Data Extract功能把对应位平面的数据提取导出往往就能得到隐藏文本或另一个文件。这里有个实操细节Stegsolve是老Java程序启动命令是java -jar Stegsolve.jar需要本地有JRE环境。另外它在高分屏上显示偏小容易产生看起来没东西的错觉不要急着关掉放大后逐帧仔细看。还有一个容易漏的变体是反白有些题把信息藏在位平面后还做了取反你看到的是一条黑底白字或白底黑字的异常带状区域这同样是线索。2.2 binwalk分离当图片里还藏着一个压缩包另一种特别常见的藏法叫文件拼接出题人把zip或其它文件直接接在图片数据的尾巴上或者塞进图片文件结构里的空闲区。这种题用binwalk扫一遍就能发现端倪。binwalk image.png会列出所有检测到的嵌入文件看到类似ZIP archive data的输出时用binwalk -e image.png就能批量提取。如果binwalk提取失败foremost按文件签名切割数据是更稳的替代方案foremost -i image.png -o output_dir。这里有一个我踩过好几轮的坑binwalk有时会把图片本身的IDAT数据块误报成压缩包导致提取出一堆乱码文件。判断是不是真藏了东西要看提取出来的文件有没有明确的文件头特征——真正的zip以PK开头带密码的zip用zipinfo查看会有加密标志。如果发现提取结果是乱码且没有有效文件头大概率是误报不用浪费时间去解。2.3 组合题型一个做过的综合案例刷题过程中印象最深的一道题把前面几种手法全部串起来了。题目给了一张看起来平平无奇的图片还原当时的处理链路是这样的。第一步file确认它确实是 PNG第二步strings里发现一段像是注释的文本但读不出实际含义第三步 binwalk 扫描发现图片尾部接了 ZIP 数据。用 foremost 提取出 zip解压提示需要密码。这时候回头再看 strings 里那段没意义的文字配合exiftool查图片的注释字段才发现出题人把密码拆成了两半——一半在图片元数据注释里另一半藏在那段看似乱码的字符串里需要按提示拼接。拼好密码解开 zip里面是一张新图片用Stegsolve逐通道看最后在蓝色通道的bit0平面上看到 flag。这道题给我留了一个很重要的教训杂项综合题就是一条线索链每一环的产出都是下一环的输入。如果你做某一步时觉得这一步的结果似乎没意义那大概率不是它没意义而是你还没找到使用它的方式。把中间产物全部记录下来比急着往下猜答案要重要得多。3. 编码转换与二维码别被长得乱吓住3.1 常见编码的识别特征与转换工具杂项里有一大类纯粹是编码题给一串看起来乱七八糟的字符实际上只是某种编码后的文本。这类题技术上不难但很多人死在了怎么认出这是什么编码这一步。编码类型典型外观识别技巧Hex只含0-9和a-f长度通常是偶数按字节转ASCII或转文件Base64字母数字加/常出现在末尾解码后仍是乱码就考虑连续解码Base32大写字母A-Z加数字2-7长度是8的倍数用base32命令解码URL编码大量%xx形式用浏览器控制台或Python unquote摩斯电码只有.-和分隔符注意空格分隔的是字母还是单词Brainfuck仅由-.,[]组成的长串扔进解释器跑一遍我个人的习惯是准备一个多合一转换脚本把 hex、base64、base32、url、rot13 这些常见操作封装成命令行工具遇到疑似编码的题先批量跑一遍。很多时候连续 base64 解码两三次就出明文了。判断时要特别注意字符集的构成规律全大写字母配数字就优先怀疑 base32出现大量等号和斜杠就优先怀疑 base64这些特征比盲目尝试可靠得多。还有个细节某些题会把编码结果先做字符串反转或倒序你解码出来是一串倒着的 flagreverse 一下才正确。所以拿到解码结果后别急着认定解错了先判断一下是不是方向问题。3.2 二维码遮挡与修复思路二维码是高频考点常见两种情况一是二维码完整直接扫就行二是二维码被遮挡或破坏需要修复后才能扫。扫描优先用手机相机或常用扫码程序即可。遇到扫不出来的情况先用眼睛检查三个定位角是否完整。定位角是二维码识别的前提如果某一块被涂黑或挖掉需要手动补回去。常见做法是用图像编辑工具把缺失部分从另一张正常二维码里裁剪补齐或者直接按正确模块颜色补成黑白方块。另一种情况是二维码上盖了一层半透明文字。遇到这种先别急着抠图把图像导入Stegsolve做几次色彩通道调整很多水印只是提高了局部亮度调整对比度后二维码图案就能恢复可扫状态。修复时要注意保持模块比例不要因为补丁导致解码时的版本判断出错。补充一句修完扫码如果还是失败可以试试把图片旋转90度再扫有些二维码方向反了也会导致扫描失败。3.3 音频隐写用频谱图看见文本音频隐写在Bugku杂项里也不算罕见最基础的套路是在Audacity里打开音频把视图切换到频谱图Spectrogram。很多题把flag以图像形式藏在频谱里人耳完全听不出来但频谱图上一眼就能看到文字轮廓。我第一次做这类题时完全没想到还反复听音频听到怀疑人生。后来养成的习惯是任何音频文件先看频谱再听内容。调整频谱视图参数也有讲究把频率范围拉高一点、把对比度调大藏得比较浅的文字会更容易浮现出来。除了频谱图还有一些音频题把信息藏在左右声道的差异里。处理方式是把音轨拆成单声道逐段对比波形重点看某一段是否存在明显异常。不过基础阶段先掌握频谱图检查就够了遇到音频题能少走一大半弯路。4. 流量分析用Wireshark还原攻击现场流量分析题在杂项里的分量越来越大因为它贴近真实的网络排查场景拿到一个抓包文件你需要像调查员一样把可疑通信过程还原出来。我在刷这类题时总结了一套稳定的三步入口。4.1 流量包分析的三个入口拿到 pcap/pcapng 文件我建议按下面三个入口依次切入。第一个入口是 Wireshark 的 Statistics - Protocol Hierarchy。它会列出包里有哪几类协议以及各自的数量占比帮你快速定位这个包到底在干什么活动。比如 DNS 请求特别多或者全是 HTTP或者存在大量可疑 TCP 重传这些分布本身就是最重要的线索。第二个入口是 Statistics - Conversations / Endpoints。看哪些IP在互相通信数据量集中在哪里。流量分析题的主角通常是传输数据量最大的那个会话优先跟着它走。第三个入口是直接跟流右键某条TCP流选择 Follow - TCP Stream就能看到这个连接的完整收发内容。HTTP 题的 flag 或线索经常就直接躺在某条流里根本不涉及复杂协议解析。4.2 从HTTP请求里捞出来被改写的文件HTTP 流量里最容易藏东西的地方是文件下载和上传响应。Wireshark 的 File - Export Objects - HTTP 可以把所有 HTTP 对象全部导出包括图片、压缩包、文本文件这个功能经常被新手忽略。搭配前面图片题的流程对导出文件再过一遍先file再strings再 binwalk。有一次我就是从流量里导出一张 PNG当时以为结束了结果 binwalk 扫描发现里面还嵌着一个 zipzip 密码在另一个 TCP 流的聊天文本里。流量包题的藏宝层级经常比普通文件题更深导出的对象一定要逐个检查不要只看第一个像样的文件就收工。4.3 一个可疑DNS查询的分析记录DNS 流量题是近年比较流行的考法核心思路是 DNS 隧道。因为 DNS 查询本身看起来无害出题人可以构造大量奇怪的子域名查询把数据按字符编码到域名里向外传递。判断方法很直观正常流量的 DNS 查询域名高度重复、格式规整而题目的 DNS 查询往往每次域名都不同、子域名部分长得像乱码。这就是在向外部传递数据。处理方式是把查询域名批量提取出来去掉固定根域名部分剩下的字符按顺序拼起来很可能就是经过编码的 flag。我第一次做这种题时只顾着看 TCP 流把 DNS 完全忽略了。后来按 Protocol Hierarchy 一看接近一半通信量都集中在 DNS 上。所以先看协议占比这个习惯真的非常值钱它往往会直接告诉你出题人在哪个层面做文章。5. 压缩包攻防伪加密、爆破与明文攻击拿到一个加密压缩包很多新手的反应是开始爆破。但爆破之前其实有两条便宜得多的路可以走。5.1 伪加密明明有密码却可以直接解ZIP 的加密标记由文件头里的通用位标记字段控制出题人有时候只是把加密标记位改成了已加密文件数据本身根本没加密。用常规解压会提示输入密码但把标记位改回去就能直接解压。具体操作用 010 Editor 或任何十六进制编辑器打开 zip找到每个条目在 local file header 里的通用位标记字段位于文件头偏移6处的两个字节如果该值是 0x0001改成 0x0000 保存再试解压。也可以找现成的 zip 伪加密修复脚本一键处理。我还发现一个更快的判定法把 zip 拖进 7-Zip 或 WinRAR如果它虽然提示有密码但能列出压缩包内部文件名而标准解压工具直接报错那大概率就是伪加密。真正加密的 zip目录信息同样是加密的看不到内部文件列表。现在我的习惯是先看能不能列目录再决定要不要动加密位。5.2 真实爆破的参数选择确认是真加密之后才轮到爆破。常用工具是 hashcat 或 john流程是先提取 hash 再跑zip2john 目标.zip hash.txt然后把 hash 交给爆破工具。爆破参数的核心是字典与掩码。出题人设密码的思路往往没有太多思路偏好弱密码、生日、简单单词。所以字典至少要有常见弱密码列表大字典可以用 rockyou.txt 这类经典库。掩码攻击适合你知道密码格式的场景比如题目提示密码是8位数字那就用?d?d?d?d?d?d?d?d的掩码跑纯数字8位这种圈定格式的爆破速度比纯字典快非常多。关于耗时GPU 环境跑纯数字8位 zip 密码也就是分钟级别但遇到纯字母或大小写混合的长密码就非常煎熬。暴力跑了几分钟没结果我会立刻停手回去重新审视题目线索——很多加密密码就是题目描述里的某个单词或者是图片元数据的某个字段。把时间花在重新读题上往往比让机器空转划算。5.3 明文攻击的适用条件还有一种压缩包加密方式值得了解已知明文攻击。原理是如果压缩包内部同时包含一个你完全知道内容的文件那么即使有密码也能利用 ZipCrypto 旧式加密的流密码特性算出密码或直接解出其它文件。适用条件一共有两个一是压缩算法确实是 ZipCrypto二是你确实知道包里某个文件的明文。所以做这类题时如果压缩包里能看到 README.txt 之类的文件先想想它内容能不能猜出来如果恰好命中就能用 bkcrack 之类工具完成攻击。这类题遇到一次就会记住不要在没确认加密算法和已知明文条件之前就盲目砸时间爆破。先判断题目类型再决定手段这句话在压缩包题上体现得特别明显。6. 从刷题到复盘我整理习题的方法最后分享一下我整理杂项习题库的个人方法。这部分看起来不像硬核技术但对我实际帮助比多刷十道题都大。6.1 按识别特征而非解题工具分类很多人整理题解喜欢按工具分类Stegsolve 的题放一起binwalk 的题放一起。但这个分类有个问题它只告诉你用什么没告诉你为什么想到用它。实战里恰恰是为什么最值钱。我后来的整理方式是按题型特征分类拿到文件的一瞬间最强的视觉或结构特征是什么图片颜色整体偏暗是一类压缩包能列目录但解不开是一类流量里全是奇怪的DNS是一类。每一类下面记录对应的判断路径和工具链。这样比赛遇到新题匹配的是特征而不是工具匹配速度和命中率完全不一样。6.2 我踩过的最浪费时间的几个坑这里写几个我反复踩、后来终于记住的坑。第一个是没有先看文件头就乱用工具。有一次题目把文本内容伪装成 .png我拿着 Stegsolve 调了半天通道最后才发现就是 txt 改了个名直接cat就能看到。从那以后file和十六进制文件头成了我每道题的固定动作。第二个是忽略strings输出的全部内容。很多题在文件里直接写了一段提示但因为提示不是 flag 格式被我默认忽略导致后面绕了一大圈。现在的习惯是把 strings 完整保存下来哪怕暂时用不上后面卡住了再回头翻。第三个是流量分析忘看 Export Objects。导出的 HTTP 对象经常直接就是压缩包或图片根本不需要手动重组的TCP流。漏掉这个功能会让人多写很多毫无意义的分析脚本。6.3 出题人视角如果我来出这道题刷到后期我养成了一个习惯每做完一道题试着反推如果我是出题人这道题我会怎么设计。这个习惯相当有用因为出题人设计题目时一定遵循藏得要有线索、解起来要有路径的原则。换句话讲任何藏在文件里的东西一定有迹可循要么是文件结构上的异常要么是元数据里的提示要么是编码上的特征。你做题时觉得毫无头绪往往不是题目没有线索而是还没具备异常感。培养异常感没有捷径只有靠大量刷题和复盘来强化。我个人实际刷下来的感受是Bugku 杂项题库的题目梯度做得比较合理从签到题的一眼可见到综合题的层层嵌套刚好覆盖了杂项能力的各个阶段。你现在看一个陌生文件能不能条件反射般地在脑子里过一遍格式标准、文件特征、隐写手段的清单就像医生看体检单一样形成职业习惯——这种能力几乎全是从杂项题里刷出来的。如果让我给一个建议不要贪多求快每道题做完后把自己卡住的位置和最终找到线索的方式写进笔记。刷题数量其实没那么重要重要的是你能不能把上一道题沉淀下来的识别特征成功调用到下一道题里。杂项习题整理的核心价值不在于那一份份答案而在于一条条能被复用的判断路径。