ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CTF Misc入门实战:从压缩包伪加密到二维码修复的完整题解

CTF Misc入门实战:从压缩包伪加密到二维码修复的完整题解 你见过一个叫flag.zip的文件双击却弹出一张图也见过一个写着“你猜我是个啥”的附件表面是图片拆开却是个压缩包。BUUCTF 的 Misc 题里这种反直觉的“身份伪装”几乎贯穿始终。我最近把 Misc 编号 26 到 30 这几道题从头到尾重刷了一遍从压缩包套娃、伪加密到二维码定位角修复、GIF 逐帧隐写算是把 Misc 的几大基础套路又夯了一遍。这篇题解写给两类人刚入门 CTF、想系统刷 Misc 打基础的新手以及已经会几道题但总在工具选择上纠结的朋友。我会按实际做题顺序来写优先讲清楚每一步的“为什么”再给命令、参数和避坑经验。后面篇幅不短建议边看边动手。1. 准备工作环境、工具和做题心态1.1 顺手的工具链Misc 题很少要求你现场写多复杂的算法更多是“识别现象→选对工具→提取信息”。所以工具链顺不顺手直接决定做题速度。我这边的完整清单如下用途工具说明文件类型识别file、010 Editor、WinHexWindows 上装一个 010 Editor 基本够用隐写扫描binwalk、foremost分离隐藏文件、识别文件偏移图片通道分析Stegsolve、zsteg查看 RGB/灰度通道低位提取 LSB 隐写二维码处理QR Research、zxing、Python PIL扫描、修复、反色、拼接二维码压缩包密码ARCHPR、fcrackzip、zip2john john爆破压缩包密码通用文本提取strings查字符串过滤 flag、key 等关键字我日常是 Windows 宿主机加一个 Kali 虚拟机。Kali 里binwalk、foremost、fcrackzip都是自带或一条apt install就能装的东西非常省心。Windows 这边主要留着 010 Editor、Stegsolve 这类 GUI 工具看字节比命令行直观很多。有些朋友会纠结“到底装 Windows 工具还是 Kali”我建议别把平台当成障碍做 Misc 题的核心是“流程感”不是某个系统的独占能力。文件复制来复制去的时候记得保留原件哈希后续排查能少很多混乱。1.2 做题前的文件处理习惯我在刷这五道题时踩过最蠢的坑就是直接双击附件并试图用系统自带解压工具打开结果把文件搞坏最后只能用哈希比对才知道原始文件已经被动过。所以现在拿到任何附件第一件事不是解压而是建一个以题目命名的目录然后做三件事记录原始文件哈希sha256sum 附件名方便出问题时对齐。file查看真实类型先不看后缀。用strings粗扫一遍看有没有明显线索。这套“文件体检”流程应该固化成肌肉记忆因为 Misc 题最常用的干扰手段就是伪装文件头、添加无意义数据、把关键信息藏在文件尾部。先把体检做了后面每一步才有参照。2. 题一[GUET-CTF2019]zips——压缩包套娃的经典教材2.1 拿到的第一步先确认压缩包类型这道题是典型的“套娃”题一层套一层中间还有密码屏障。下载下来拿到一个 zip解压后不是 flag而是另一个secret.zip。这时候最容易犯的错误是双击打开、看它要密码就开始猜密码猜不出来就上爆破工具硬跑。其实应该先停下来做一件事用 010 Editor 打开secret.zip看它的加密标志位。ZIP 文件的结构可以简化理解成三块每个文件有自己的本地文件头以50 4B 03 04开头、中央目录以50 4B 01 02开头、最后的结束记录以50 4B 05 06开头。真正的加密信息藏在这些头的“通用位标志”字段里。本地文件头里签名后 4 字节是压缩需要的版本再往后偏移 6 处就是通用标志中央目录里签名后 8 字节处也是同样的位置。如果通用标志位最低位是1代表文件加密是0就是明文。所谓“伪加密”就是文件实际没加密但有人把这个标志位改成了1让你误以为要密码。这种题在 BUUCTF 上属于高频考点。我当时是直接搜索50 4B 01 02在十六进制区找到中央目录头然后看它的通用标志值结果是09 00。09这个值说明不仅“加密位”被置 1连“数据描述符位”也被置了 1看起来很像是加密文件。但关键是本地文件头里数据段的实际内容并没有被加密这种情况就是伪加密。2.2 伪加密的判断与手工修复判断方法很简单把通用标志位从09 00改成00 00保存再用解压工具打开。如果能正常列出文件并解出内容那之前就是伪加密如果仍然提示要密码那就是真加密。修改时需要注意本地文件头和中央目录里的标志位最好都改掉因为不同解压工具的检测逻辑不完全一样有的只看中央目录有的两个都看。我的习惯是全部改成00 00省得来回试。这里补充一个小技巧如果你不想手动改字节可以直接用ZipCenOp.jar这类工具一键修复伪加密。但作为做题的人我还是建议至少手动改一次搞清楚偏移和字段含义。因为一旦题目把伪加密做成“本地文件头正常、中央目录异常”这种混合状态一键工具反而可能修复不完整手动改反而更快。修复后重新解压得到一个脚本和一个flag.zip。看到flag.zip心里别高兴太早题名既然叫 zips第二层密码大概率跑不掉。这次打开它确实要密码。我先进 010 Editor 看标志位发现是真加密于是进入下一阶段爆破。2.3 真实加密的密码爆破与嵌套解包爆破 ZIP 密码我优先看有没有提示。很多题目会在压缩包注释、文件名、甚至注释字符串里塞线索。flag.zip的文件名就很可疑明显是故意叫这个名字吸引你注意真正线索可能藏在注释里。用zipinfo -v flag.zip或者 010 Editor 看压缩包注释发现提示写着“密码是六位数字”。既然确认是六位纯数字爆破范围就很窄了从000000到999999一共一百万种组合CPU 跑也就几分钟。Windows 下我用 ARCHPR攻击类型选“暴力破解”字符集只勾选“所有数字”范围设 6 到 6点开始就行。Linux 或 macOS 下我更推荐命令行方式fcrackzip -u -v -l 6-6 -c 1 flag.zip这里的-c 1表示数字字符集-l 6-6表示长度固定为 6-u是尝试解压验证密码是否正确。不要小看这个参数如果密码是 8 位及以上的纯数字暴力破解时间会指数级上升这时可以用zip2john提取哈希再交给我们熟悉的 hashcat 用 GPU 跑。但在这道题里六位数字用fcrackzip就足够了。爆破得到密码后解压出内容里面是一个被处理过的二维码图片。到这里还没完我建议把二维码先扔给扫码工具试扫如果扫码结果是一段 base64就用 Python 解一下如果扫不出来就很可能经历了编码、改尺寸、定位角缺失这些环节再按后面我会讲到的二维码修复流程处理。这道题的第二层产出是一张二维码扫码后得到一个字符串解码就是 flag。把这层也过了整个套娃链条才算闭环。3. 题二[BJDCTF2020]你猜我是个啥——文件类型识别的反向思维3.1 file 一眼看穿真实身份这道题的名字本身就是提示“你猜我是个啥”。下载回来一个文件后缀可能是.png也可能是.zip。我拿到手先执行file 你猜我是个啥输出是PNG image data, 423 x 423表面看是一张正常图片。这时候千万不要被后半句骗了file判断的是文件头不保证整个文件都是 PNG。很多 Misc 题的做法就是把一个 zip 或者另一个图片直接 append 到 PNG 文件后面或者把文件头改掉让工具误判。继续用 010 Editor 打开这张图拉到文件尾部能明显看到一串十六进制是50 4B 03 04这是 ZIP 本地文件头的签名。也就是说图片文件的后半段被塞进了一个压缩包。Windows 的图片查看器能正常打开它因为 PNG 的尺寸、像素数据都在尾部的多余数据并不会导致图片解码失败这也是为什么很多人会忽略这种隐藏数据。3.2 binwalk 与 foremost 分离隐藏数据确认尾部有 ZIP 后最简单的方式是直接用 binwalk 扫描整个文件binwalk -e 你猜我是个啥-e会自动提取已知偏移位置的压缩包。如果 binwalk 版本或者依赖库不全它可能只报偏移不自动提取这时候我习惯再补一个foremostforemost -i 你猜我是个啥 -o extractedforemost按文件签名来切分会把识别到的 ZIP、PNG 等文件分别放到不同目录。实际跑完之后extracted/zip目录里会有一个压缩包。我把它解压得到flag.txt打开就是完整 flag。这里有一个值得记下的点binwalk -e有时候提取出来的文件不完整尤其当隐藏数据没有对齐到标准扇区时。如果解压报错你可以用dd按偏移手动截取。比如 binwalk 报告 ZIP 从偏移123456开始那就执行dd if你猜我是个啥 ofhidden.zip bs1 skip123456bs1是逐字节读取避免偏移计算误差。很多“提取失败”并不是题目复杂而是工具偷懒手动 dd 一下反而更干脆。3.3 把“文件体检”养成习惯做完这道题我最大的体会是看到图片就下意识用看图软件打开是 Misc 新手最常见的惯性。正确的姿势应该是先file、再strings、再binwalk这三个命令加起来用不了几秒钟但能把大部分简单隐写直接扫出来。strings这步也别省而且建议带长度过滤strings -n 8 你猜我是个啥 | grep -iE flag|key|ctf|base64长度过滤很关键否则一堆图片信息里的短字符串会干扰视线。一旦能在图片尾部看到 base64 特征或者flag{字样就不用再往下拆了直接解码拿结果。这种“先扫后拆”的顺序几乎适用于所有 Misc 图片题。4. 题三[SUCTF2018]single dog——残缺二维码的定位与修复4.1 用 Stegsolve 找到二维码single dog这个题名本身没有太多提示附件就是一张 PNG。先按照体检流程走一遍file确认是图片binwalk没有发现明显隐藏文件strings也没看到 flag。这时候就该上 Stegsolve 看通道信息了。Stegsolve 不是直接给你弹出二维码而是让你逐个通道查看图片在不同位平面下的样子。操作路径是Analyse - Data Extract左侧面板有 R/G/B 三个颜色通道的 0 到 7 位共 24 个复选框你可以逐个勾选最低位例如只勾 Red 0后看预览。实际看到红通道第 0 位平面上出现了一个黑白相间的方块矩阵但很奇怪四个角少了三个定位角。二维码一定有四件事缺一不可三个“回”字定位角、一条连接它们的边框通常是白色间隔、数据模块区、以及足够的容错级别。如果只有其中一个定位角任何扫码工具都会抓瞎。这道题的难点就在这里不是没有二维码而是二维码被擦伤了。4.2 用 Python 补全三个定位角修复的思路非常直接手动画三个标准 QR 定位角。一个标准定位角是 7x7 的模块结构从外到内依次是7x7 黑色方块、5x5 白色方块、3x3 黑色方块。写一个 Python 脚本在左上、右上、左下三个位置分别画上这个图案然后保存成新图。我用的脚本大概是这样的from PIL import Image, ImageDraw img Image.open(single_dog.png).convert(L) w, h img.size draw ImageDraw.Draw(img) module 8 # 单个二维码模块对应的像素数可以根据实际数一下 def draw_finder(x, y, size): # 外圈黑色 7x7 draw.rectangle([x, y, x 7 * size - 1, y 7 * size - 1], fill0) # 中间白色 5x5 draw.rectangle([x size, y size, x 6 * size - 1, y 6 * size - 1], fill255) # 中心黑色 3x3 draw.rectangle([x 2 * size, y 2 * size, x 4 * size - 1, y 4 * size - 1], fill0) draw_finder(0, 0, module) draw_finder(w - 7 * module, 0, module) draw_finder(0, h - 7 * module, module) img.save(fixed_qr.png)这里有一个很容易踩的坑module的像素数如果估错画出来的定位角比例就会失衡二维码依然扫不出来。我一般会在画之前先数一下图片里单个二维码模块大概是几个像素然后取整。定位角可以画大一点但不要覆盖到旁边已有的数据模块。当然PIL 的矩形坐标是左闭右开的最后那个-1是纯经验修正画完保存后可以先用系统图片查看器放大检查一遍三个角是否差不多大黑白比例是否正确。如果二维码整体是反色的也就是说白块是数据、黑块是背景扫码前最好用ImageOps.invert反色一次。因为大部分扫码工具并不都支持反色二维码手动转一下更保险。4.3 识别结果的编码处理把修复后的图片扔进 QR Research 或者用手机扫码得到一串看起来不像 flag 的字符。我当时拿到的结果是一段 base64 串结尾有。这种特征非常明显base64 编码的字符串由大小写字母、数字、、/组成长度通常是 4 的倍数结尾可能有填充。直接用 Python 解import base64 s 这里的base64串 print(base64.b64decode(s))解码后得到的就是 flag。如果扫码结果是一串十六进制比如可以明显看到666C6167这种 ASCII 码的十六进制表达那也是先转字节再按字符读。说到底二维码扫出来不一定是终点它很可能只是编码链路的中间一环。养成“拿到可疑字符串先判断编码再解码”的习惯能少走很多弯路。5. 题四[SWPU2019]我Flag呢——GIF逐帧隐写与二维码复原5.1 用 file 和 Frame 提取确认隐写方式这道题又是一个二维码但它换了一种藏法。附件下载下来是个gif用图片查看器打开每一帧画面都像是一张二维码的碎片但单看任何一帧都凑不出完整图案。很多新手会逐帧截图保存然后试图用 PS 手动拼接这样能做但效率很低而且很容易因为帧边界没对齐导致二维码依然无法识别。先file确认是 GIF再用 Stegsolve 的Frame Browser逐帧浏览一遍观察每帧之间变化规律。常见的规律有两种一种是每帧独立显示二维码的不同碎片需要拼图另一种是每帧在上一帧基础上不断追加白色像素点相当于“逐步画出”完整二维码。如果是后者处理起来反而更简单直接把所有帧叠加起来就是完整图形。我当时看到的情况属于第二种于是直接写脚本把所有帧做“逻辑或”叠加。这里解释一下为什么用逻辑或如果把黑白图转成二进制白色像素是 1黑色像素是 0两帧叠加时如果某个像素在任意一帧里是白色那么合并结果保留白色。这正好符合“逐帧累积绘制”的隐藏方式。5.2 用 Python 叠加帧还原完整二维码脚本思路是先读取 GIF 的所有帧统一转成 1 位黑白图然后从第一帧开始依次和后续帧做逻辑或最后保存合并图from PIL import Image, ImageChops img Image.open(flag.gif) frames [] try: while True: frames.append(img.convert(1)) img.seek(img.tell() 1) except EOFError: pass merged frames[0] for f in frames[1:]: merged ImageChops.logical_or(merged, f) merged.save(merged.png)这里有个细节GIF 的调色板不统一时直接convert(1)可能会把原本白色区域变成黑色。稳妥一点的做法是先convert(L)再做一次阈值二值化防止颜色反转。如果叠加后发现二维码缺少定位角就回到上一题的“补定位角”环节画完再扫。如果叠加后整张图看起来是一片黑白噪声但那其实是因为方向反了用ImageOps.invert翻一下就能看到清晰图案。5.3 定位角修复与最终解码这道题最终也落在二维码扫描上。修复完定位角并扫码后得到的也不是纯 flag而是又一段 base64。这个套路在 Misc 里挺常见多层隐写、二维码、base64层层剥洋葱。处理时保持耐心一层层解每解一层就记录一下中间结果避免因为混淆上一层的输出导致绕圈子。扫码工具有时会很不稳定同一张二维码在 QR Research 扫不出来但微信一扫就出来了反过来也有过。我建议电脑上装两个以上扫码库手机上再留一个备选。如果所有扫码工具都失败最常见原因是图片分辨率太低可以把二维码局部放大几倍再扫或者把图片做一次锐化增强黑白边界通常能救回来。6. 常见问题与避坑实录6.1 压缩包解不开先别急着爆破压缩包打不开第一反应不应该是跑爆破而是先检查加密位。伪加密和真加密在爆破难度上是天壤之别伪加密改两个字节就能解真加密可能要跑好几个小时。所以我的判断顺序固定为file确认是不是标准 zip / rar。010 Editor 查看通用标志位判断是否伪加密。看压缩包注释、文件名有没有密码提示。如果确实真加密再决定用字典、掩码还是社工方式爆破。爆破工具的选择也有讲究工具适用场景说明ARCHPR图形界面适合小范围暴力破解速度快但密码长度太长会卡死fcrackzipLinux 命令行适合字典和简单掩码灵活性高-c 1跑纯数字很方便zip2john john需要 GPU 加速时提取哈希后给 hashcat 或 john 跑hashcat大型字典、掩码破解对长密码有奇效但要准备字典和掩码规则我刷题时发现CTF 出题人很少把压缩包密码设定成复杂的字母数字组合因为那样会严重拖慢解题节奏。绝大多数情况是伪加密、纯数字弱口令、或者密码就藏在注释里。所以如果你跑了几分钟还没出结果先回头找提示别硬刚。6.2 二维码扫不出的调试顺序二维码类题目失败率最高但排查路径也很固定。如果扫码无结果按这个顺序试检查是否缺定位角缺了就补。检查是否反色是就反转。检查图片分辨率小图先放大。检查是否有多余的边框或噪点用图像处理工具裁剪边缘。用多个扫码工具交叉测试。还有一个容易被忽略的点二维码的可识别区域不一定铺满整张图片。有时候图片四周有大块留白二维码在中间很小这会影响扫码精度。用 PIL 按二维码的包围盒裁剪出来只保留二维码区再去做修复和识别成功率会高很多。6.3 工具选型ARCHPR、fcrackzip 与 hashcat 怎么选有朋友会问既然 fcrackzip 能跑为什么还要装 ARCHPR我的经验是短密码、简单规则用 ARCHPR 最省心图形界面能看到进度长密码、需要指定复杂掩码时fcrackzip 更灵活遇到那种 8 位以上包含大小写符号的密码再上 hashcat 配合字典。但这里要提醒一句做题归做题别为了爆破浪费时间。CTF 的出题环境基本都考虑了“人工可接受的时间”如果一个密码跑 20 分钟还出不来大概率是你的方向错了比如没发现这是伪加密、没看注释、或者根本不需要密码而是文件头被改了。及时止损回到上一步重新分析往往比干等 hashcat 跑完更有效。我在刷完这五道题之后的一个体会是Misc 题目表面上千变万化本质上就是“信息隐藏、编码转换、格式伪装”三件事的组合。你把文件体检流程、ZIP 结构、二维码修复、常见编码识别这四样基本功打扎实后面遇到再奇怪的题目也能快速拆解成已知的小环节。后续的题解我会继续往后更新下一批大概会把流量分析和内存取证类题目也加进来。如果你在复现的过程中卡住了回头翻翻这篇的思路链条大部分问题都出在第六节列出的那几个环节里。
返回列表