攻防世界Misc分类下有一道题叫“套娃”名字里这个问号就很有灵性——你解完一层发现还有一层再解完一层又冒出来一段乱码最后才意识到自己可能被套麻了。这道题算是Misc入门阶段必刷的经典之一它不考某个高深漏洞而是把Misc最常见的几条主线串在一起文件隐写、压缩包伪加密、多层编码。对刚入CTF的新手来说刷完这道题基本就等于把“拿到一个未知文件之后该怎么办”的完整流程走了一遍。这篇文章我会按实际解题时的顺序把每一层怎么拆、工具怎么用、为什么这样用讲清楚也会把我踩过的坑单独列出来。如果你正准备刷Misc题或者在某一步卡住了可以参考这里的思路。先说结论这种“套娃”题的难点从来不是某一个环节有多难而是你根本不知道下一层藏在哪里、以什么形式存在。1. 拿到“套娃”题的第一眼题目辨识与破题思路1.1 “套娃”题型为什么这么经典Misc杂项类别在CTF里一向以“知识面广、工具链长”著称而套娃题就是把多个小知识点像糖葫芦一样串起来的典型代表。它的名字来源于俄罗斯套娃一个文件打开之后是另一个文件另一个文件解压后又是一段编码或是一张图片中嵌着一个压缩包压缩包里又藏着一个文本文本里又是一串Base64解完才发现还要再转一次摩斯电码。这种题之所以成为Misc绕不开的经典是因为它打的不是某个冷门漏洞而是所有Misc题都通用的底层能力怀疑一切。一个看似正常的图片可能是多个文件的拼接体一段看似乱码的字符可能是多层编码叠加的结果。这种“信息不一定在它应该待的位置”的意识是Misc题和逆向、Pwn完全不同的思维模式。套娃题恰好能把这种意识一次性训练到位。对新手来说套娃题还有个好处每个环节单独拎出来都不难不需要数学功底不需要汇编知识只要会装工具、会看十六进制、会认常见的编码特征就能一步步走下去。正因如此它经常被放在攻防世界Misc入门列表里刷完它你对binwalk、foremost、010 Editor这些工具的信任度会完全不一样。1.2 破题第一步永远是静态侦察不是盲目解压很多人拿到附件的第一反应是双击打开或者直接解压。这个习惯在套娃题里非常吃亏。我个人的习惯是任何附件到手先做一轮静态侦察再决定怎么动它。侦察的本质是“让文件自己先交代一部分信息”靠的不是猜而是几个简单命令。第一步是看文件真实类型。下载下来的附件可能没有扩展名也可能扩展名是假的比如一个明明是ZIP的文件被改成了.png。用file命令就能识别真实类型它会根据文件头部的魔数判断而不是看扩展名。file 附件名第二步是看文件大小。这个细节很多人忽略但我可以负责任地说套娃题里文件大小是最明显的“夹带”信号。一张正常的PNG图片可能只有几百KB如果一张图片有好几MB大概率里面塞了别的东西。同理一个压缩包解压出几十个字节的文本文件那文本内容大概率不是终点而是下一层的线索。第三步是看字符串。用strings提取文件中的可打印字符很多hint会直接暴露。比如图片的EXIF信息、压缩包的注释、作者字段都可能藏着密码或者指向下一层的提示。strings 文件名 | head -50 strings -n 8 文件名 # 只看长度8以上的字符串过滤杂音第四步是看元数据。用exiftool查看图片属性拍摄时间、GPS、作者、注释这些字段里出现可疑内容时优先级非常高。为什么这么重视静态侦察因为套娃题的信息分布是分层的有些密码就大大方方写在属性里你如果一上来就埋头解压反而容易错过最明显的提示。2. 核心工具箱与原理补课识别伪装和嵌套的关键2.1 文件识别与分离三件套file、binwalk、foremost静态侦察做完如果发现文件有问题就该上分离工具了。Misc套娃题里最常用的三件套是binwalk和foremost配合file做结果校验。它们的定位完全不同。binwalk是扫描工具它按文件签名Magic Bytes在目标文件里搜索已知文件类型。一个重要的观念是binwalk 扫描出“某个偏移位置有ZIP数据”不代表那个ZIP一定完整可用它只是告诉你这里有匹配特征后续需要用dd或者binwalk -e把数据提出来验证。实际使用时我更喜欢先跑一次普通扫描看结构再决定怎么提取。binwalk 目标文件 binwalk -e 目标文件 # 自动提取缺点是不够精细foremost是基于文件签名做批量分离的工具它会把识别出的所有文件按类型存到输出目录里。它有-i指定输入文件、-o指定输出目录、-t指定要提取的文件类型如 zip, jpg, png。遇到binwalk自动提取失败的情况foremost往往能兜底。它俩不是替代关系而是互补关系。工具核心用途常用参数适用场景file识别文件真实类型无第一步确认文件头binwalk扫描内嵌文件位置-e 自动提取--dd 手动提取定位隐藏的ZIP/RAR/图片foremost按签名分离文件-i 输入-o 输出-t 类型binwalk提取失败的兜底方案这套三件套的使用逻辑可以总结为一个循环file看全局binwalk找位置foremost做分离分离完file确认。每一层嵌套都跑一遍这个循环基本能保证不漏东西。2.2 ZIP伪加密原理、识别与修复套娃题里ZIP压缩包出现的频率极高而它最喜欢挖的坑之一就是“伪加密”。要理解伪加密先得知道ZIP文件的结构。一个ZIP文件里有两种关键记录位于文件开头的本地文件头Local File Header和位于文件末尾附近的中央目录Central Directory。两者都有一个字段叫“通用位标志”General Purpose Bit Flag这个字段的第0位也就是最低位是加密标志位。该位为0文件未加密该位为1文件被标记为加密伪加密的骚操作在于这个标志位被人为置为1但文件数据本身根本没有被加密。就好比快递箱上贴了一张写着“已上锁”的标签但锁压根没扣上。解压工具看到标签就不让你直接拿东西逼着你要密码但实际上只要你把标签撕掉箱子一拉就开。识别伪加密最直接的方法是看十六进制。用010 Editor或WinHex打开ZIP文件找到本地文件头也就是50 4B 03 04开头的区域。紧跟在后面的第6、7字节就是通用位标志。如果看到一个看起来像是“01 00”或“09 00”的数值说明加密标志位可能被置1了。同理在中央目录区域找到50 4B 01 02开头的记录偏移8、9的位置是中央目录里的标志位。修复伪加密有两种常用思路。第一种是用现成工具比如ZipCenOp.jar很多CTF老玩家都用它java -jar ZipCenOp.jar r 加密的压缩包.zipr代表repair它会把标志位中的加密位清零。第二种是手动改用010 Editor把对应位置的值从09 00改成00 00保存后直接解压。这里要注意如果文件是真加密你改了标志位后解压时不会要密码但会立刻报CRC校验错误因为数据本身是密文硬撑着解出来的内容也是乱的。所以改完能不能正常解压本身就是判断真假加密的标准。2.3 常见编码识别一眼认出最后一层套娃题走到最后往往是一段编码等着你。常见的坑有Base64、十六进制、摩斯电码、栅栏密码、凯撒密码偶尔还有Brainfuck或Ook。识别编码的速度直接决定你能否顺畅收尾。判断编码类型有几个实用规律。看到一串只包含A-Za-z0-9/且尾部带或的字符串大概率是Base64直接base64 -d解码。看到连续成对出现的十六进制字符比如666C6167这种优先转ASCII。看到只有点和横线组成的序列尤其是还有空格或斜杠分隔的那基本就是摩斯电码。看到一串只有-[].,这种符号的那就是Brainfuck。套娃题偶尔会把编码叠两层比如先十六进制转ASCII得到Base64再解码才出Flag所以解完一次发现是乱码别慌再看一眼字符特征往往还能再解一层。3. 解题实操全流程从图片到Flag的完整拆解3.1 第一层附件解压与图片信息挖掘我这次拿到的附件是一个压缩包解压后得到一张PNG图片。第一件事不是打开看画的是什么而是先查身份。file 1.png # 输出: 1.png: PNG image data, 1224 x 732, 8-bit/color RGBA, non-interlaced确认是PNG之后再扫一下有没有夹带。“套娃”这个名字已经暗示了这层但我依然按流程走了binwalk 1.png。输出末尾出现了一行类似“ZIP archive data”的记录偏移量在文件很靠后的位置这基本就是实锤了图片尾部拼了一个ZIP。这里有个值得留意的细节单纯用binwalk -e有时会连图片一起当作前缀提取出全部数据不如手动dd精确。知道了偏移量我用dd把ZIP数据切出来dd if1.png ofhidden.zip bs1 skip偏移量切出来之后file hidden.zip确认就是一个ZIP压缩包。再往下走发现这个ZIP有密码需要先找线索。回头看图片strings -n 8 1.png输出里有一串很突兀的字符既不像正常的图片元数据也不是普通英文单词而是一段Base64。我当时试着解出来发现是一串读不通的字符串但它非常符合充当密码的格式。拿它去解hidden.zip一次成功。这一层的心得是密码往往不在压缩包里而在上一个载体上。图片的字符串、属性、末尾残留数据都是密码的高发区。解压失败先别急着上爆破工具往回看一层往往更有效。3.2 第二层利用ZIP伪加密突破压缩包解开hidden.zip之后里面又是一个压缩包套娃本色开始展现了。这个新压缩包同样有密码但这次我用之前的方式试了好几个候选字符串都没成功。这时候就该怀疑伪加密了因为套娃题里“伪加密”是特别经典的一环几乎到了出现频率最高的程度。用010 Editor打开这个压缩包看50 4B 03 04开头的本地文件头第6、7字节的值是09 00加密标志位确实置1了。但单凭这一点还不能确认是伪加密因为真加密的标志位也是1。关键动作是把09 00改成00 00保存然后直接解压试试。unzip 第二层.zip如果它能正常解压且内容完整说明它本来就是伪加密——数据没加密只是标记了密码锁。如果解压报错或CRC校验失败那就说明是真加密得回去老老实实找密码。这次运气不错修改后直接解压成功得到一个文本文件和一张新的图片。从这一层起我基本确认了题目结构每层都是一个载体里面藏一个压缩包再藏一段线索如此反复。顺带提一句如果你手头没有010 Editor用zipinfo -v 文件.zip也能看到加密标志信息只是可读性没那么直观。大原则是见到加密ZIP先花两分钟判断伪加密再考虑暴力破解这个顺序能省大量时间。3.3 第三层多层编码叠加与Flag提取解压出来的文本文件打开一看内容是一段点儿和横线组成的序列分隔符是空格和斜杠——非常典型的摩斯电码特征。CTF里摩斯电码的常见形态有两种一种是用.和-直接表示另一种是把点横替换成其他字符比如0和1、*和-这一层看起来是标准的点横。解码摩斯电码我习惯用CyberChef也可以直接用在线解码器把点横序列转成ASCII。转出来之后内容又长这样ZmxhZ3tzb21ldGhpbmdfaXNfaGlkZGVufQ末尾带这是Base64的典型特征不用犹豫直接解echo ZmxhZ3tzb21ldGhpbmdfaXNfaGlkZGVufQ | base64 -d输出是一行可读的flag。到这一步整道题的链子才全部走完。回看整条路径就是“PNG图片 → 隐藏ZIP → 密码在图片strings里 → 第二层ZIP → 伪加密修复 → 文本文件 → 摩斯电码 → Base64 → flag”。每一层单独看都不算新奇但串起来之后对“文件在嵌套中传递信息”的体感会非常强烈。这一层的教训是解码时要时刻想着“这可能还有一层”。很多人解完Base64看到可读字符串就以为结束了其实摩斯电码解出来之后出的还是编码。我的经验是只要解出来的是由标准编码字符集组成的字符串就把它当成“又一层”而不是“终点”。4. 踩坑实录与排查技巧4.1 常见卡壳点为什么就你出不来我在刷这类题和带新人复盘的时候收集过不少典型卡壳现场很多问题不是不会而是踩在了同一个坑里这里集中说一下。第一个高频卡点是binwalk什么都扫不出来。原因通常有三种一是文件被二次压缩或做过格式转换签名特征被破坏二是夹带的数据不在文件里而是在文件名、注释、属性这类“边界区域”三是binwalk的签名库版本太老识别不了新格式。解决办法是别只依赖binwalk用xxd或010 Editor直接手动看文件末尾的十六进制很多ZIP或压缩包在尾部会留下明显的50 4B签名一眼就能发现。第二个高频卡点是解压密码错误。原因往往是密码其实已经出现过了但你没认出来。比如图片属性里的字符串、网络流量包里的某个字段、甚至文件名本身都可能是密码。遇到密码错误我的排查顺序是先strings扫一遍所有上一层的文件再看文件属性最后把文件名、注释复制出来试一遍。如果全都试过还不行再考虑伪加密或暴力破解。第三个高频卡点是改完伪加密标志位后解压报错。这里要分清两种情况如果报CRC错误说明是真加密改标志位没用如果报“文件名乱码”或“数据损坏”可能是你改错位置了ZIP如果有多个内部文件每个文件都有自己的加密标志位要检查所有文件头不能只改第一个。用010 Editor的“搜索所有50 4B 03 04”功能逐个查看并修改这是最稳妥的。第四个高频卡点是一段字符串怎么解都不对。常见原因是编码方向反了或者中间还有一层你没看出来。比如Base64解码得到一串十六进制你还按Base64继续解当然不行。我的建议是每解一层就停下来分析字符集问自己“这像什么”而不是拿着同一种解反复尝试。4.2 工具与命令备忘把这次解题过程中真正用到的命令整理在这里方便直接抄作业。# 侦察阶段 file 目标文件 strings -n 8 目标文件 exiftool 目标文件 # 扫描与分离 binwalk 目标文件 foremost -i 目标文件 -o 输出目录 dd if目标文件 of分离出的文件 bs1 skip偏移量 # 压缩包操作 unzip 压缩包.zip # 正常解压 zipinfo -v 压缩包.zip # 查看压缩包详细信息 java -jar ZipCenOp.jar r 压缩包.zip # 修复伪加密 # 编码解码 echo 字符串 | base64 -d echo 字符串 | xxd -r -p除了命令本身还有几个操作习惯值得一提。一是所有工具都建议在Linux环境或Kali里跑binwalk、foremost本身就是Linux工具Windows上装不仅麻烦而且文件路径和命令行为差异会导致一些莫名其妙的错误。二是每次分离出来的文件都要单独存目录不要都堆在当前目录否则下一轮binwalk扫描会把上一轮的结果也扫进去干扰判断。三是涉及可执行文件时先在虚拟机里做静态查看别在宿主机上直接运行这个不用多说安全习惯要养成。4.3 这类题的通用方法论从“套娃”提炼一条Misc主线刷完这道题之后我认为最有价值的收获不是某个具体解法而是一条可以复用到其他Misc题的操作主线。概括成一个递归循环看类型 → 扫字符串 → 扫隐藏文件 → 分离提取 → 尝试解压解码 → 拿到结果后再回到第一步。每拿到一个新的层就重新跑一遍这个循环直到得到可读的flag。这个循环里有三个判断节点需要注意。第一个判断节点是“这层是终点还是中转站”如果解出来是标准编码就是中转站。第二个判断节点是“压缩包是真的加密还是伪加密”用修改标志位的方式试探比盲目爆破快得多。第三个判断节点是“线索是否出现在当前层的显眼位置”很多密码就大大方方写在文件名、注释、属性里越明显的地方越容易被忽略。掌握了这条主线其实你已经不是在刷一道题了而是在建立一套文件取证和隐写分析的基础方法论。后面再遇到LSB隐写、GPS隐写、二维码容错、NTFS数据流这些更细的分支都是在这条主线上做加法。我个人实际刷题过程中的体会是套娃题最考验的不是技术深度而是耐心和信息敏感度。每一层都像一次小小的解谜但解谜的关键往往就在你手边的某个细节里。当时我卡在第二层密码上将近半小时后来发现线索就在第一张图片的字符串里只是它藏在一长串乱码中间我没往“这就是密码”的方面想。后来我养成了一个习惯任何可疑字符串都先存下来宁可多试不可漏掉这个习惯帮我解决了不少后续题目的瓶颈。最后再分享一个小技巧如果遇到某一步无论如何都推不下去试着把当前文件重新跑一遍strings和binwalk但这次加-x看十六进制或者用xxd直接看文件尾部。很多“藏得太深”的东西其实就光明正大待在文件末尾套娃题尤其喜欢把下一层直接拼接在当前文件尾PDF、图片、压缩包都干过这种事。眼睛扫不到就让十六进制帮你扫。