DASCTF2021 MISC赛题复盘:编码隐写与流量取证核心技巧
发布时间:2026/10/18 18:26:01 锦皓数字建站

1. 赛题整体复盘与设计思路拆解打CTF比赛有个很反直觉的地方比赛当时做出来的题过两周再回头看往往会有完全不同的理解。DASCTF2021这场MISC方向的题目就是典型例子当时在赛场上被各种编码套娃和文件结构绕得头晕赛后静下心来复现才发现出题人的设计思路其实相当清晰每一层都卡在一个具体的知识点上。MISC这个方向在CTF里一直是个特殊存在。它不像PWN那样有明确的漏洞利用链也不像RE那样有清晰的逆向目标MISC更像是一个什么都有可能的综合考察区。DASCTF2021的MISC题目整体难度中等偏上但胜在考点覆盖面广从基础的编码识别到文件格式分析再到隐写术和流量分析几乎把MISC常见的几个大类都摸了一遍。这也是为什么这场比赛的MISC题目值得赛后认真复现——它是一套很好的MISC能力自检清单。这篇文章面向的读者是已经接触过CTF、对MISC方向有基本了解但想系统提升的选手。如果你还完全没打过CTF建议先找几道入门级的编码题练手再回来看这篇复现记录会更有收获。整篇文章会按照题目类型分类—核心考点拆解—实操复现步骤—踩坑记录的结构展开每一道题都会把当时赛场上的思路和赛后复现时的优化解法都讲清楚。先说一个整体判断DASCTF2021 MISC方向的题目核心考察的是信息提取的敏感度和工具链的熟练度。很多题目的难点不在于技术本身有多深而在于你能不能从一堆看似无关的信息中快速定位到关键线索以及能不能在第一时间想到用哪个工具去处理。这个能力在赛场上靠的是经验积累赛后复现就是最好的积累方式。2. 编码与隐写类题目核心考点解析2.1 多层编码套娃的识别与拆解逻辑编码题是MISC里最基础但也最容易翻车的类型。DASCTF2021里有一道典型的编码套娃题给了一长串看起来像Base64的字符串但直接解码会得到乱码。当时赛场上很多选手卡在这一步原因是没有仔细看字符串的字符集特征。复现时我重新梳理了这类题目的标准处理流程。第一步永远是观察字符集纯大小写字母加数字加等号大概率是Base64如果出现了大量非ASCII字符可能是经过了多层编码或者加密如果字符串长度有规律比如都是8的倍数那可能是某种分组编码。这道题的关键在于第一层确实是Base64但解码后的内容不是明文而是一段十六进制字符串。这里有个经验Base64解码后的结果不要只看内容要看格式。如果解出来是一串十六进制字符0-9a-f那下一步大概率是Hex解码如果解出来是类似#xxx;的HTML实体编码那就往HTML解码方向走如果解出来是一串看起来像乱码但字符集在可打印范围内的内容可能是凯撒密码或者栅栏密码。这道题的完整解码链是Base64 → Hex → 反转字符串 → Base64 → 得到flag。其中反转字符串这一步是最容易漏掉的因为反转后的字符串看起来和反转前一样像那么回事不会给你明显的错误提示。我的做法是在每一层解码后都检查一下字符串的头部和尾部看看有没有明显的flag格式特征比如flag{或者DASCTF{如果没有就尝试常见的变换操作反转、大小写互换、ROT13。注意编码题不要死磕一种解法如果某个方向试了三次还没有进展果断换思路。赛场上时间宝贵赛后复现可以慢慢试但也要养成多线并行的习惯。2.2 图片隐写的常见手法与工具选型图片隐写是MISC的另一个重头戏。DASCTF2021里有一道图片题给了一张看起来完全正常的PNG图片但文件大小比同尺寸图片大了不少。这个大了不少就是第一个线索。图片隐写的排查流程我总结了一个固定的checklist按顺序过一遍基本不会漏文件头尾检查用十六进制编辑器看文件头是否符合PNG/JPEG规范文件尾有没有附加数据。PNG以89504E47开头以IEND块结束如果IEND后面还有数据那就是附加信息。EXIF信息检查用exiftool查看图片的元数据有时候flag就藏在Comment或者Artist字段里。LSB隐写检查用StegSolve或者zsteg工具分析最低有效位看看有没有隐藏信息。颜色通道分析有些题目会把信息藏在某个颜色通道的特定区域需要分通道查看。文件结构分析用binwalk查看文件内部有没有嵌入其他文件PNG的IDAT块、JPEG的APPn段都是常见的藏数据位置。这道题最后定位到的是PNG的IDAT块中嵌入了额外的数据。出题人把一段Base64字符串拆散后写入了多个IDAT块的空闲区域。这种手法不算新颖但胜在隐蔽——如果你只是用StegSolve看LSB完全看不出异常必须用binwalk或者手动解析PNG块结构才能发现。复现时我用Python的struct模块手动解析了PNG的块结构把每个IDAT块的数据提取出来拼接再Base64解码得到了一个压缩包。压缩包解压后是一张新的图片新图片的LSB里藏着flag。这种套娃设计在MISC里很常见核心思路就是每一层都只给你一点点线索逼着你把整个工具链都过一遍。2.3 音频隐写的频谱分析与摩斯电码提取音频隐写是很多选手的薄弱环节DASCTF2021里有一道音频题给了一个WAV文件听起来像是白噪声。当时赛场上有人直接放弃了觉得这能藏什么。但赛后复现发现这道题的设计其实很经典。音频隐写的排查思路和图片类似但工具不同。我常用的工具组合是Audacity看波形和频谱、Sonic Visualiser更专业的频谱分析、以及Python的librosa库做批量处理。这道题的关键在于频谱图用Audacity打开音频切换到频谱视图把频率范围调到0-8000Hz就能看到一段明显的摩斯电码图案。摩斯电码的提取是个细致活。短音是.长音是-间隔是空格长间隔是字母分隔。这道题的摩斯电码藏在2000Hz左右的频段用Audacity的频谱图可以直接读出来。但要注意出题人故意把播放速度调快了直接听是听不出来的必须看频谱图。提取出来的摩斯电码解码后得到一串字符这串字符是下一层的密码。下一层是一个加密的压缩包密码就是摩斯电码解出来的内容。压缩包解开后是flag。提示音频隐写不要只听一定要看。人耳能分辨的信息量远小于频谱图能展示的信息量。另外Audacity的频谱图设置里把窗口大小调到2048或4096频率分辨率会更高更容易看清细节。3. 流量分析与文件取证实操要点3.1 流量包协议分层解析与数据提取流量分析题在DASCTF2021里占了两道一道是HTTP流量一道是USB流量。这两种流量的分析思路完全不同但核心都是协议分层解析。HTTP流量分析的第一步是用Wireshark打开pcap文件然后应用过滤器http。这一步能过滤掉大量无关的TCP握手和ACK包直接看到HTTP请求和响应。这道题的flag藏在某个HTTP响应的Body里但出题人做了两层处理第一层是gzip压缩第二层是Base64编码。Wireshark可以直接导出HTTP对象把响应Body保存下来然后用Python解压和解码。这里有个细节Wireshark的导出HTTP对象功能有时候会把多个响应合并到一个文件里导致解压失败。我的做法是手动在Wireshark里定位到具体的响应包右键Follow HTTP Stream然后把Body部分复制出来单独处理。虽然麻烦一点但准确率更高。USB流量分析是另一个套路。USB流量通常记录的是鼠标或键盘的输入数据需要根据USB协议规范来解析。鼠标流量的数据格式是第一个字节表示按键状态第二到第三个字节表示X轴偏移第四到第五个字节表示Y轴偏移。键盘流量的数据格式是第一个字节表示修饰键第三个字节表示按下的键值。这道USB题记录的是键盘输入但出题人把按键值做了偏移处理。标准USB键盘的键值映射表是固定的比如0x04对应a0x05对应b以此类推。但出题人把所有键值加了1所以0x05实际对应的是a。这个偏移量需要自己试出来——我的方法是先假设没有偏移解出一串乱码然后观察乱码的字符分布发现所有字符都往后移了一位于是把偏移量设为-1重新解码就得到了正确的flag。3.2 磁盘镜像与内存取证的关键步骤文件取证类题目在DASCTF2021里出现了一道磁盘镜像题。给了一个img文件需要用取证工具分析。这类题目的标准流程是文件类型识别用file命令查看文件类型确认是磁盘镜像还是内存镜像。分区表分析用fdisk -l或者mmls查看分区结构确定每个分区的起始扇区。文件系统挂载用mount命令或者 autopsy工具挂载分区浏览文件内容。删除文件恢复用foremost或者scalpel工具恢复被删除的文件。关键字搜索用grep或者strings命令搜索flag格式的字符串。这道题的难点在于flag被藏在了一个被删除的文件里。用autopsy挂载镜像后可以看到文件系统里有一个被标记为已删除的文本文件。直接打开是空的但用foremost恢复后文件内容就出来了。这里要注意foremost恢复文件时默认会恢复所有类型的文件如果镜像比较大恢复过程会很慢。我的做法是先用foremost -t txt只恢复文本文件速度快很多。注意磁盘取证题一定要先做镜像的只读挂载不要直接写入。虽然CTF题目里的镜像文件通常是一次性的但养成只读操作的习惯对真实工作场景很重要。3.3 压缩包密码破解与伪加密识别压缩包相关的题目在MISC里出现频率极高DASCTF2021里有一道题就是压缩包伪加密加上弱密码破解的组合。伪加密的原理是ZIP文件格式中有一个通用位标记字段其中第0位表示文件是否加密。如果这个位被置为1但实际数据并没有加密就称为伪加密。识别伪加密的方法是用十六进制编辑器打开ZIP文件找到PK开头的文件头检查通用位标记字段。如果是伪加密把这个位改回0就可以直接解压。这道题的第一层是伪加密改完标记位后解压出一个新的压缩包。第二层压缩包是真加密但密码是弱密码。我用的是fcrackzip工具配合rockyou字典几秒钟就跑出来了。密码是password123属于典型的弱密码。这里有个经验压缩包密码破解优先试常见弱密码不要一上来就跑大字典。常见弱密码包括123456、password、admin、root、qwerty、以及题目相关的关键词比如题目名称、比赛名称的变体。如果这些都不行再用字典跑。4. 常见问题与排查技巧实录4.1 编码识别错误的典型场景与纠正方法编码题最容易犯的错误是误判编码类型。比如把Base32当成Base64或者把十六进制当成Base64。这两种编码的字符集有重叠但长度特征不同Base64编码后的长度通常是4的倍数Base32编码后的长度通常是8的倍数。如果字符串长度是8的倍数且只包含A-Z和2-7那大概率是Base32。另一个常见错误是忽略编码的嵌套顺序。有些题目会先做Base64再做Hex有些则反过来。如果顺序搞错解出来的就是乱码。我的做法是先尝试最常见的顺序Base64 → Hex如果不行再尝试其他组合。同时每解一层都要检查结果是否符合下一层编码的特征。编码类型字符集特征长度特征常见嵌套顺序Base64A-Z, a-z, 0-9, , /, 4的倍数第一层Base32A-Z, 2-7, 8的倍数第一层Hex0-9, a-f偶数长度第二层URL编码%XX格式不定任意层HTML实体#xxx; 或 xxx;不定任意层4.2 工具链配置与版本兼容性避坑MISC方向对工具链的依赖度很高但很多工具在不同操作系统上的表现不一致。我在复现过程中踩过几个坑StegSolve在Linux下需要Java环境而且高版本Java可能不兼容。建议用Java 8运行或者直接用zsteg替代。binwalk在解析某些PNG文件时会误报把正常的IDAT块识别为嵌入文件。遇到这种情况手动解析PNG块结构更可靠。Wireshark的USB流量解析需要配置协议默认情况下可能无法正确识别USB键盘和鼠标流量。需要在首选项 → Protocols → USB里设置正确的设备类型。fcrackzip在Windows下的性能远低于Linux如果字典比较大建议在Linux环境下跑。提示建议用Docker维护一个MISC工具链镜像把常用工具都装进去避免每次换环境都要重新配置。我自己的镜像里包含了binwalk、foremost、exiftool、zsteg、fcrackzip、john、hashcat、Audacity、Wireshark、以及Python的pwntools和librosa库。4.3 赛场时间分配与解题优先级策略赛后复现和赛场实战最大的区别是时间压力。赛场上MISC题目通常有5-8道但时间只有几个小时。我的经验是先扫一遍所有题目按难度和分值排序优先做有明确思路的题。具体来说编码题和简单的图片隐写题应该在前30分钟内解决这类题目思路清晰工具熟练的话很快就能出flag。流量分析和磁盘取证题需要更多时间放在中间阶段做。音频隐写和复杂的压缩包题目放在最后因为这类题目不确定性大可能卡很久。另外不要在一道题上死磕超过40分钟。如果40分钟还没有明确进展果断换题等做完其他题目再回来。很多时候换个思路或者休息一下回来就能发现之前忽略的线索。4.4 赛后复现的正确姿势与能力提升路径赛后复现不是把flag找出来就完事了。我的复现流程是不看Writeup先自己做一遍即使赛场上没做出来赛后也要先自己尝试记录卡住的地方。看Writeup对比思路重点看别人是怎么定位关键线索的工具选型有什么不同。用不同方法再实现一遍比如别人用StegSolve我尝试用Python脚本实现同样的功能。整理成自己的工具库把复现过程中写的脚本、用到的命令整理成文档下次遇到类似题目可以直接复用。出题人视角复盘思考如果自己是出题人会怎么设计这道题考点是什么陷阱在哪里。这个流程走下来一道题的价值会被榨干比单纯做十道题收获都大。DASCTF2021的MISC题目我前后复现了三遍第一遍是赛后一周第二遍是一个月后第三遍是三个月后。每一遍都有新的理解尤其是第三遍很多当时觉得理所当然的步骤其实都有更优的解法。最后分享一个我个人的习惯每次复现完我都会写一份如果赛场上再遇到类似题目我的处理流程是什么的checklist。这份checklist会随着复现题目的增多不断更新现在已经成了我打比赛时的速查手册。MISC这个方向经验比天赋重要而经验就是靠这样一道一道题积累出来的。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。