
NISACTF 2022的MISC题单里midlevel这道题排在中游位置我当时拿到的附件就一个midlevel.zip题面一句多余的描述都没有。第一次做它的人容易发懵一个压缩包能有什么考点真上手解完才发现它把图片隐写、压缩包解密、多层编码三个常规考点串成了一条完整的链路难度刚好卡在“单个知识点都会组合起来就卡壳”的位置。这篇WP我按实际操作顺序写命令和工具参数都给到位想完整复现的直接照着抄想学思路的也可以当MISC中等题模板用。要复现这道题其实不需要多新的环境Kali自带binwalk、foremost、python3就够用Windows侧再准备一个ARCHPRAdvanced Archive Password Recovery或者同类压缩包密码恢复工具剩下的就是按部就班一层层往下剥。下面我把每一步的思路、命令、踩坑点都摊开讲清楚争取让你看完能自己独立跑通。1. 题目拆解为什么叫“midlevel”以及它在考什么1.1 拿到的附件长什么样下载附件后第一步不是解压而是先确认文件类型。我习惯性地开了终端file midlevel.zip unzip -l midlevel.zipfile输出就是一个标准的ZIP archiveunzip -l列出压缩包内部结构后才开始有价值里面只有road.png和readme.txt两个文件没有子目录没有隐藏文件。看到这种结构思路基本就定死了——readme是提示文件road.png是主要的藏匿点如果图片里分离出加密压缩包那readme指的就是密码线索。这里我多说一句拿到任何CTF附件先备份原始文件再动手。因为后面用binwalk -e、dd截取、修改PNG头部等操作都可能破坏原文件一旦操作失误还能回退重来。我在做这道题时就把原始zip复制了一份到safe/目录里后面果然用上了。1.2 中等级别题的结构共性比赛里的MISC难度分层很有意思签到题通常只有一个考点比如单纯解个Base64或者看个图片属性中等题则会把三四个常规知识点串成一条链难题才会上升到流量分析、协议还原、脑洞甚至算法构造。midlevel就属于中间层。这类“组合链路题”有个共同特征单看每个环节都不难难的是你不知道下一步该往哪走。比如binwalk分离出加密包后你可能第一反应是暴力破解密码但密码其实就藏在图片被截断的下半部分等你打开密文文件发现是一串Base64解码后又冒出一段倒序的Hex。链条每一步都依赖上一步的结论方向错了就会浪费大量时间。所以我做这类题的习惯是先把能看的全看一遍把线索攒在手里再动手操作。2. 第一步不是爆破是先抠文件readme与图片分析2.1 readme.txt不是废话解压midlevel.zip之后我第一时间看了readme.txtcat readme.txt里面的内容大概意思是密码是四位数字但别想着硬猜路会告诉你答案。现在回头看这句话几乎是明示了——密码线索在road.png里而这张图本身被动过手脚。这里有个很容易踩的坑很多新手拿到“四位数字密码”就去开ARCHPR跑0到9999结果跑到一半发现就算跑出来也不知道对不对因为根本没有确认依据。正确的做法是先找密码线索爆破永远是最后的兜底手段而不是第一步。尤其当题目给了readme时里面大概率藏着解题方向的提示。2.2 图片复合文件分析binwalk与foremost的取舍先对road.png做基础检查file road.png strings road.png | head -50 binwalk road.pngfile确认是PNG图片strings前50行没有直接暴露flag但binwalk扫描结果很关键——在文件末尾附近能看到明显的ZIP archive数据。这时候有两个选择直接binwalk -e一把梭还是手动dd抠出来。我的建议是先用binwalk -e试一次因为它会建一个_road.png.extracted目录自动把识别到的文件分出来省事。但binwalk -e不是银弹偶尔会把分离出来的ZIP写坏或者把不是文件的偏移量也硬拆出来。如果解出来的压缩包打不开就改用dd精确截取dd ifroad.png ofsecret.zip bs1 skip文件偏移量skip参数的单位是字节表示跳过PNG原有的数据直接从binwalk输出的偏移量开始取。我这里遇到的secret.zip起始偏移量在文件靠后位置用dd抠出来后file secret.zip能正常识别为ZIP archive。顺便说一句foremost的适用场景和binwalk不太一样当文件里嵌入了大量碎片或者binwalk识别类型容易误报时foremost -T -i road.png -o output/按文件头分类提取会更稳。这道题用binwalk就够但工具要提前准备好。2.3 图片宽高不对改回来才能看到密码解开road.png用图片查看器打开我发现它只显示上半部分下半部分是灰的或者花屏。这是MISC题里非常经典的坑PNG的IHDR数据块里的高度字段被改小了导致有效显示区域被截断真实图像内容没有完整展示。修复方法是用十六进制编辑器010 Editor或HxD打开PNG定位到IHDR数据块文件头8字节固定为PNG签名偏移12到15是“IHDR”块类型偏移16到19是宽度4字节大端偏移20到23是高度4字节大端偏移29到32是IHDR块的CRC校验值。如果直接把高度改大CRC对不上图片查看器会直接报“IHDR CRC Error”根本打不开。所以必须同步重算CRC。这里我写了一个小脚本之后遇到同类题目直接复用import struct, zlib def fix_png_height(path, new_height, outfixed.png): data bytearray(open(path, rb).read()) # 高度字段位于偏移204字节大端 struct.pack_into(I, data, 20, new_height) # IHDR块的CRC是IHDR类型数据偏移12到28共17字节的crc32 crc zlib.crc32(data[12:29]) 0xffffffff struct.pack_into(I, data, 29, crc) open(out, wb).write(data) if __name__ __main__: fix_png_height(road.png, 768)我把高度恢复后图片下半部分出现了几行文字其中就有一行四位数字1397。到这里readme里的“密码是四位数字”就对上了secret.zip的打开密码就是它。注意实际题目里宽高被改的可能是宽度也可能是高度甚至两者都被改过。修复前先用file或者看图软件确认现象再决定改哪个字段不要盲目套脚本。2.4 顺手过一遍StegSolveLSB检查要成习惯分析图片时我还会顺手用StegSolve把各个通道看一遍。操作很简单File打开图片Analyse里的Data Extract可以按位提取勾选RGB最低位平面Bit Order选LSB First如果图片里嵌了二维码或字符串这里通常能直接看到。虽然midlevel这道题我实际检查下来LSB通道没有东西但这一步尽量不要省。原因是MISC题的隐写方式经常叠加改宽高藏一层、文件拼接藏一层、LSB再藏一层。如果你只看了一个方向就急着往下走很可能漏掉关键信息。StegSolve是Kali自带的老工具做这类题几乎是必开的。3. 压缩包解密爆破之前先搞清楚加密类型3.1 先判断“伪加密”还是“真加密”用密码1397之前我先对secret.zip做了加密类型检查。ZIP格式里每个文件的局部文件头PK\x03\x04偏移8处有一个2字节的通用位标志general purpose bit flag如果最低位为1表示该文件有加密标志如果实际数据根本没有加密只是标志位置1这就是“伪加密”。判断方法用压缩软件尝试不输密码解压。如果WinRAR或7-Zip能直接打开看到里面的文件基本可以断定是伪加密如果提示输入密码还要再看压缩算法。伪加密的处理通常有两种一是用010 Editor直接把标志位的第0位清零保存后再解压二是用ZipCenOp.jarjava -jar ZipCenOp.jar r secret.zip这工具比较老但对ZIP伪加密的修复成功率不错。不过需要注意工具修复前最好复制一份备份因为它的操作会直接改写原文件。3.2 ARCHPR跑四位数字密码范围和长度是关键secret.zip确认是真加密不是伪加密我就用ARCHPR爆破。步骤记录一下方便新人照着做打开ARCHPR把secret.zip拖进去攻击类型选Brute-force暴力破解范围标签页里字符集只勾选“所有数字”把容易拖慢速度的大小写字母、特殊符号全去掉长度设为最小4、最大4点“开始”。为什么要强调范围和长度因为ARCHPR默认会勾选所有可打印字符如果不清空它会把每个位置都尝试几十种字符四位纯数字的10000种组合可能还会跑很久限制成纯数字后速度会快好几个量级。我这边最终跑出来的密码就是图片里那行字提示的1397。这里要提醒一下ARCHPR并不是所有ZIP加密方式都能破解。如果压缩包用的是AES-256加密ARCHPR要么不支持要么破解速度慢到离谱。判断加密方式有个笨办法用7-Zip打开看压缩包信息里显示的是ZipCrypto还是AES-256。ZipCrypto的爆破效率才有保证AES加密就别硬跑字典了老老实实回头找密码线索。3.3 爆破不出来时的替代思路万一密码不在四位数字范围或者压缩包是AES加密这时候有两条路可以走一条路是已知明文攻击。如果你知道ZIP里某个文件的明文内容可以用bkcrack这类工具做密钥恢复。原理是ZIP的ZipCrypto算法存在已知明文攻击的弱点只要有一个文件的内容能对上就能恢复内部密钥进而解出其他文件。CTF里常见的情况是压缩包里有一个公开的说明文档或者题目hint里直接给出了某个文件内容这时候先别急着爆破。另一条路是CRC32碰撞。如果压缩包里的文件非常小比如只有几个字节那么可以通过枚举可能明文、计算CRC32值与压缩包记录里的CRC值比对反向推出文件内容。这个方法只适合小文件大文件就别想了。如果这两条路都走不通就要回头重新看readme、图片exif、图层、零宽度字符这些容易被忽略的角落。密码往往不在远处就在你已经看过的文件里。4. 解出来的还不是flag多层编码的识别与还原4.1 解包后到底拿到了什么用密码1397解压secret.zip里面只有一个middle.txt。打开这个文件看到的是一串以等号结尾的可见字符N2Q2YzY1NzY2NTZk...这个特征非常明显就是Base64。先用终端解一层base64 -d middle.txt step2.txt cat step2.txt解码出来的内容是一串十六进制字符没有直接变成可读的flag。继续用xxd把Hex还原成字节xxd -r -p step2.txt step3.txt cat step3.txt这时屏幕上出现了一段字符但读起来是倒着的或者说乱序的。使用rev反转一下rev step3.txt到这里完整的NISACTF{...}就出来了。整个过程就是Base64 → Hex → 字符串反转三层嵌套。单独拿任何一层出来都是基础得不能再基础的知识点但组合在一起就需要你每一步都判断对方向。比如第二层如果没看出是Hex直接把它当成字符串去看就会一脸懵。4.2 编码类型快速判断技巧做多层编码题最快的方法是先看字符集特征再决定用什么工具解。我把常用的判断逻辑整理成一个速查表特征编码类型常用解码方式以结尾大小写字母数字混合Base64base64 -d/ CyberChef From Base64只有0-9a-f且长度为偶数Hexxxd -r -p/ CyberChef From Hex只有0和1长度为8的倍数二进制Pythonint(x,2).to_bytes()大量%xxURL编码Pythonurllib.parse.unquote()字符顺序整体异常末尾像常见flag前缀的倒序字符串反转rev/ Python切片判断的时候还有几个变种要注意Base64有URL-safe版本用-和_代替和/还有Base32字符集是A-Z和2-7和Base58去掉了0OIl等易混淆字符。如果字符集不符合常规Base64不要硬用base64 -d先确认编码类型再动手。4.3 CyberChef一条recipe跑完所有层terminal里一步步解能帮助你理解流程但比赛时效率优先我一般会用CyberChef把多层解码串成一条recipe。步骤如下把middle.txt的内容粘贴到Input添加From Base64按实际需要添加From Hex添加Reverse如果有需要再补一个From Base64。每一步的输出都会实时显示在Output里直到出现NISACTF{...}就可以停了。CyberChef的“Magic”模块可以自动尝试常见编码组合看起来省事但我不建议在这类题上直接用它。因为Magic会输出大量猜测结果很多是噪音干扰判断手搭recipe反而更可控。另外用CyberChef之前最好先自己在终端手解一遍只有理解了编码顺序才能在recipe里正确排序模块。编码顺序搞错了输出永远是乱码。5. 踩坑记录与复盘这套流程还能用在哪些题上5.1 我在这道题上实际踩过的坑第一个坑一开始没认真看readme上手就爆破四位密码。结果爆破工具跑了大半天范围还是全字符集既慢又没意义。后来才发现密码线索就在图片下半部分白白浪费了时间。第二个坑修改PNG高度后没有同步重算CRC导致图片查看器直接报错一度以为是文件被我改坏了。所以改IHDR块一定要带上CRC重算这是一个固定动作不能省。第三个坑ARCHPR爆破时字符集没有限制成纯数字。四位纯数字理论上只要几秒钟到几分钟但因为默认勾选了所有字符导致爆破时间被拉长很多。后来我把范围限定成0-9速度立刻快了很多。第四个坑解码到最后发现字符串顺序不对一度怀疑是编码识别错了。后来我注意到字符末尾隐约像是flag头NISACTF{的反向这才想到用rev反转。识别反向字符串的技巧是把字符串末尾几个字符单独拿出来如果恰好是你熟悉的前缀的逆序那基本就是整体被反转了。第五个坑binwalk输出里的类型名会误导人。它有时候会把ZIP识别成filesystem或者其他类型这时候不要只盯着名字看要看偏移量。偏移量可信类型名仅供参考。5.2 一套通用MISC中等题模板做完这道题后我把整个流程整理成了一个固定模板后面再遇到类似的中等题直接套用环节推荐操作验证方式拿到附件file确认类型unzip -l或7z l列内容先备份原文件阅读提示优先看readme、注释、图片exif判断密码/线索是否存在图片分析binwalk分离、StegSolve查LSB、检查宽高分离出的文件是否能正常打开压缩包处理先判断伪加密再决定爆破或已知明文攻击确认加密算法类型最终解码识别字符集特征按序解码看到完整flag格式即收工这套模板我跟你说实话不止适用于NISACTF这类校赛后来打AWDP、赣网杯、长城杯这些赛事凡是非流量、非算法的MISC题我基本也是这套流程先过一遍。MISC考的很少是奇技淫巧更多是流程有没有走全线索有没有漏看。5.3 复盘为什么这道题值得做三遍第一遍可以照着命令抄把整条链路跑通重点是熟悉工具输出长什么样。第二遍关掉WP自己从头推导每一步该做什么卡住了再回头看。第三遍不看题面把整个流程压缩成自己脑子里的checklist压缩包看提示图片查隐写加密包试伪加密爆破限制字符集解码按特征识别。我个人的体会是MISC题拼的不是那种灵光一闪的脑洞而是熟练度。你把“分离文件→查隐写→爆密码→解编码”这条路走过几十遍之后遇到midlevel这类题基本就是照着流程按部就班flag自己会浮出来。所以第一次做这种中等题觉得手忙脚乱别气馁它本质上就是一套需要练成肌肉记忆的固定动作多刷几道相似的题速度很快就能上来。最后再分享一个小技巧每次做完一道MISC题把用过的工具、识别特征、命令实战存成一个自己的checklist下次碰到直接对照。这比临时翻笔记、刷论坛高效得多。midlevel这道题虽然不长但作为一张“中等题标准地图”值得收藏。