恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
DASCTF 2021 MISC赛题复盘:文件体检、流量分析与编码还原实战
首页
资讯中心
/
DASCTF 2021 MISC赛题复盘:文件体检、流量分析与编码还原实战
DASCTF 2021 MISC赛题复盘:文件体检、流量分析与编码还原实战
发布时间:2026/10/18 4:56:23
1. 赛题背景与整体复盘思路DASCTF 2021 那场 MISC 方向的题目当时在圈子里讨论度相当高。我是在赛后隔了几天才拿到题目包花了大概两个晚上把几道有代表性的题从头到尾复现了一遍。写这篇复盘主要是给当时卡住没做出来、或者想系统补一下 MISC 解题思路的朋友一个参考。MISC 这个方向不像 PWN 和 RE 那样有非常明确的攻击链它更像是一个“什么都有可能考”的综合科目——编码转换、隐写、流量分析、文件结构、内存取证、甚至一些社工味的推理都可能出现在同一场比赛里。这篇复盘适合谁看如果你已经会基本的 Linux 命令、能看懂十六进制、知道 Python 怎么跑脚本那读起来会比较顺。如果你是完全零基础也没关系我会把每一步的“为什么这么做”讲清楚而不是只丢一个命令让你抄。MISC 题最怕的就是“照着 writeup 抄一遍换个题又不会了”所以我会重点讲排查思路和工具选型的逻辑。整体上DASCTF 2021 的 MISC 题目有几个明显特点一是多考点叠加一道题里往往既有文件结构分析又有编码还原还夹带一点隐写二是对工具链熟练度要求高很多步骤用现成工具几秒钟搞定不知道工具就要手搓半天三是细节埋得深经常在文件头、文件尾、注释区、甚至像素的最低有效位里藏东西。复现的时候我把每道题的完整链路都走了一遍包括那些当时靠猜、赛后才想明白的环节。下面我会按“整体设计思路拆解 → 核心细节与实操要点 → 完整复现流程 → 常见问题与排查技巧”这个顺序展开中间穿插我当时踩过的坑和后来总结出来的经验。工具方面主要用到file、binwalk、foremost、010 Editor、Wireshark、zsteg、steghide、CyberChef这几样都是 MISC 圈的常规配置没有冷门依赖。2. 内容整体设计与思路拆解2.1 为什么 MISC 题要先做“文件体检”拿到任何一道 MISC 题我的第一反应永远不是直接打开看内容而是先做一次“文件体检”。所谓体检就是搞清楚这个文件真实类型是什么、里面有没有嵌套其他文件、有没有附加数据。这一步看起来简单但能解决相当一部分题目。为什么这么强调因为出题人最喜欢干的事情之一就是改文件头。比如把一个 PNG 的后缀改成.txt或者把 ZIP 的前几个字节抹掉让你以为它是个损坏文件。如果你不先做体检直接按后缀去打开很可能就卡在第一步。体检的标准动作是这几条file 文件名看系统识别出的真实类型注意它和扩展名是否一致。xxd 文件名 | head看文件头的前几十个字节对照魔数表判断真实格式。binwalk 文件名扫描内部是否嵌入了其他文件系统或压缩包。strings 文件名 | less提取可打印字符串找 flag 格式、提示语、URL 等线索。这四步走完基本能对题目有个初步判断。我当时复现的第一道题file显示是dataxxd一看文件头是PK\x03\x04明显是个 ZIP但扩展名给的是.png。这就是典型的“改后缀”套路把后缀改回.zip解压第一层就出来了。2.2 多考点叠加题的拆解逻辑DASCTF 2021 有几道题是明显的多考点叠加。比如一道题里你先要从一张图片里提取出隐藏的压缩包解压后得到一个流量包流量包里再还原出一段编码最后解码才拿到 flag。这种题的设计逻辑是层层递进每一层都是一个独立的小知识点但串起来就成了一道有区分度的题。面对这种题我的拆解原则是先把每一层的“输入”和“输出”理清楚。第一层的输入是原始文件输出是一个压缩包第二层的输入是压缩包内容输出是流量包第三层的输入是流量包输出是编码字符串第四层的输入是编码字符串输出是 flag。把这条链路画出来之后你就知道每一步该干什么不会在中间迷路。这里有个经验如果某一层卡住了先确认上一层的输出是不是完整的。我复现的时候就遇到过图片里提取出来的压缩包其实不完整因为提取工具默认只抓了一部分数据导致解压报错。后来换了个提取方式把完整的附加数据都抠出来才顺利解压。所以链路清晰之后还要保证每一环的数据是完整的。2.3 工具选型的取舍现成工具 vs 手搓脚本MISC 题的工具选型我的原则是能用现成工具快速验证的绝不手搓需要精细控制的才自己写脚本。比如判断文件类型、扫描嵌套文件file和binwalk就是最快的没必要自己写。但涉及到按位提取、按特定偏移读取数据这种精细操作现成工具往往不够灵活这时候就得用 Python 手搓。举个例子有一道题需要在图片的像素数据里按特定规律提取信息。zsteg能自动跑很多常见的 LSB 组合但它跑出来的结果是一堆候选需要你自己判断哪个是对的。如果题目稍微改一下提取规律zsteg就无能为力了。这时候用 Python 配合PIL库自己写几行代码按位读取反而更直接。所以我的建议是先把常规工具跑一遍拿到候选结果如果候选结果不对或者题目明显是自定义规律再上手写脚本。这样既不会浪费时间重复造轮子也不会在工具搞不定的时候干瞪眼。3. 核心细节解析与实操要点3.1 文件头修复与嵌套文件提取文件头修复是 MISC 的基本功。常见的魔数有这么几个建议记牢文件类型魔数十六进制ASCII 表现PNG89 50 4E 47 0D 0A 1A 0A.PNG....JPEGFF D8 FF...ZIP50 4B 03 04PK..RAR52 61 72 21Rar!GIF47 49 46 38GIF8PDF25 50 44 46%PDF修复的时候用010 Editor或者wxHexEditor打开把缺失的字节补回去就行。注意补的时候要对齐偏移别补错位置。我一般会先备份原文件改坏了还能重来。嵌套文件提取binwalk -e 文件名是最省事的它会自动把识别到的嵌套文件提取到_文件名.extracted目录里。但binwalk有个坑它有时候会把一个完整文件切成好几段尤其是文件比较大或者有多个嵌套的时候。这时候提取出来的东西可能是残缺的需要手动调整偏移重新提取。手动提取的思路是先用binwalk看到嵌套文件的起始偏移然后用dd命令按偏移切出来。比如dd if原文件 of提取文件 bs1 skip起始偏移 count长度skip是跳过多少字节count是提取多少字节。长度可以从binwalk的输出里估算或者用文件结束偏移减去起始偏移。这个操作我复现的时候用了好几次比binwalk -e更可控。3.2 流量分析题的抓包还原技巧流量分析题的核心是从一堆数据包里找到异常的那几条。我的常规流程是用Wireshark打开 pcap 文件先看Protocol Hierarchy协议分层统计了解整体流量构成。用Conversations会话统计看哪些 IP 之间通信最多异常通信往往集中在少数会话里。过滤 HTTP 流量看Export Objects里有没有可导出的文件。如果流量是加密的或者自定义协议就跟着 TCP 流看原始数据。DASCTF 2021 有一道流量题表面上看是普通的 HTTP 流量但Export Objects导出的图片打不开。后来跟着 TCP 流看发现图片数据被分成了好几段传输中间还夹杂着干扰数据。把每段的有效数据拼起来才得到完整的图片。这种题考的就是对 TCP 流重组和分片的理解。还有一个技巧注意流量包的时间戳。有些题会把关键信息藏在特定时间点的数据包里比如某个时间点突然出现一条异常请求。按时间排序之后异常数据包往往很显眼。3.3 编码还原的常见套路与陷阱编码还原是 MISC 里最“磨人”的环节因为编码方式太多了而且经常套娃。常见的编码有Base64、Base32、十六进制、URL 编码、Unicode 转义、摩斯电码、凯撒密码、栅栏密码等等。我的处理原则是先识别特征再逐层解码。比如看到一串以结尾、只包含大小写字母和数字的字符串大概率是 Base64看到%xx格式的是 URL 编码看到\uXXXX的是 Unicode 转义。识别出特征之后用CyberChef的Magic功能可以自动尝试多种解码组合省去手动试错的时间。但CyberChef的Magic不是万能的它有时候会给出错误的方向。我复现的时候就遇到过Magic把一段摩斯电码识别成了别的编码解出来是乱码。后来手动按摩斯电码的规则.和-分隔去解才拿到正确结果。所以自动工具的结果要验证不能盲信。还有一个陷阱多层编码的顺序。比如先 Base64 再反转字符串再十六进制解码顺序错了就解不出来。这时候要结合题目给的提示比如文件名、注释、字符串里的关键词来判断顺序。如果实在没提示就穷举常见的组合用脚本批量试。4. 实操过程与核心环节实现4.1 第一层图片隐写与附加数据提取复现的第一道题给了一个 PNG 图片。我先跑了一遍常规检查file challenge.png # 输出PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced binwalk challenge.png # 输出显示在偏移 0x1A2B3C 处有一个 ZIP archivebinwalk明确提示有 ZIP 嵌套。我用dd按偏移提取dd ifchallenge.png ofhidden.zip bs1 skip$((0x1A2B3C))提取出来的 ZIP 能正常解压里面是一个traffic.pcap文件。这一步的关键是偏移要算准skip的值是十进制的0x1A2B3C要先转成十进制。我一般直接用$((0x...))让 shell 自己算避免手算出错。提示binwalk输出的偏移有时候是十进制有时候是十六进制看清楚再转换。提取出来的文件先用file确认类型别急着往下走。4.2 第二层流量包分析与数据重组拿到traffic.pcap之后用Wireshark打开。先看协议分层发现 90% 以上是 HTTP剩下的是 TCP 和 DNS。用Export Objects导出 HTTP 对象得到一个data.bin但打开是乱码。跟着 TCP 流看发现data.bin的内容被分成了 5 段传输每段之间夹杂着一些无关的 HTTP 请求。把 5 段的有效数据按顺序拼起来得到一个完整的文件。拼接的时候要注意每段数据的起始和结束位置别把 HTTP 头也拼进去。拼接完成后file识别出这是一个gzip compressed data。解压mv data.bin data.gz gunzip data.gz得到一个文本文件里面是一长串 Base64 字符串。这一步的坑在于TCP 流里的数据可能不是按顺序到达的Wireshark默认按时间排序但重组的时候要按 TCP 序列号排序。我一开始按时间顺序拼结果解压报错后来按序列号重新排才成功。4.3 第三层编码套娃与最终 flag 获取文本文件里的 Base64 字符串解码后得到一串十六进制。十六进制转 ASCII 后又是一串 URL 编码。URL 解码后得到一段摩斯电码。摩斯电码解码后终于看到 flag 格式的字符串。整个解码链路是Base64 → 十六进制 → ASCII → URL 编码 → 摩斯电码 → flag我用CyberChef把这几步串成一个 recipe一次性跑完。但中间有个细节摩斯电码的分隔符。题目里用的是/分隔字母空格分隔单词如果分隔符搞错了解出来就是乱的。我一开始把/当成了单词分隔结果解出来一堆无意义的字母组合。后来仔细看题目给的提示才发现/是字母分隔空格才是单词分隔。提示编码套娃题每一步解出来的结果都要先看一眼确认是“有意义的中间态”再往下走。如果解出来是乱码大概率是上一步的解码方式或分隔符搞错了。4.4 完整复现命令汇总把上面的流程整理成可直接复现的命令序列# 第一层文件体检与嵌套提取 file challenge.png binwalk challenge.png dd ifchallenge.png ofhidden.zip bs1 skip$((0x1A2B3C)) unzip hidden.zip # 第二层流量分析 # 用 Wireshark 打开 traffic.pcapExport Objects 导出 data.bin # 按 TCP 序列号重组数据段得到 data.gz gunzip data.gz # 第三层编码还原 # 用 CyberChef 或 Python 脚本依次解码 python3 decode.pydecode.py的核心逻辑import base64 import urllib.parse with open(encoded.txt, r) as f: data f.read().strip() # Base64 解码 step1 base64.b64decode(data).decode() # 十六进制转 ASCII step2 bytes.fromhex(step1).decode() # URL 解码 step3 urllib.parse.unquote(step2) # 摩斯电码解码 morse_dict {.-: A, -...: B, -.-.: C, -..: D, .: E, ..-.: F, --.: G, ....: H, ..: I, .---: J, -.-: K, .-..: L, --: M, -.: N, ---: O, .--.: P, --.-: Q, .-.: R, ...: S, -: T, ..-: U, ...-: V, .--: W, -..-: X, -.--: Y, --..: Z, -----: 0, .----: 1, ..---: 2, ...--: 3, ....-: 4, .....: 5, -....: 6, --...: 7, ---..: 8, ----.: 9} words step3.split( ) flag for word in words: for char in word.split(/): flag morse_dict.get(char, ?) flag print(flag)这个脚本跑完flag 就出来了。注意摩斯电码的分隔符要根据题目实际给的调整别照搬。5. 常见问题与排查技巧实录5.1 文件提取不完整怎么办这是复现时最常遇到的问题。binwalk -e提取出来的文件打不开或者解压报错大概率是提取不完整。排查思路先用binwalk看嵌套文件的起始和结束偏移确认提取范围。用dd手动按偏移提取count给足宁可多提一点也别少提。提取出来的文件用file确认类型如果类型不对说明偏移或长度有问题。如果文件有多个嵌套逐个提取别一次性全提。我踩过的坑是binwalk -e默认只提取它认为“完整”的文件如果嵌套文件被截断它可能直接跳过。这时候手动dd反而更靠谱。5.2 流量包打不开或解析异常Wireshark打不开 pcap常见原因有两个一是文件头损坏二是文件被截断。文件头损坏的话用010 Editor对照标准 pcap 头修复被截断的话只能拿到多少分析多少或者找题目有没有提供完整版。解析异常还有一种情况pcap 里混入了非标准协议的数据。这时候Wireshark可能显示为Malformed Packet。别慌跟着 TCP 流看原始数据往往能发现关键信息。5.3 编码解不出来或解出来是乱码编码题卡住的排查顺序确认上一步的输出是不是完整的、正确的。确认编码方式识别对不对看字符集特征。确认分隔符、大小写、填充字符这些细节。用CyberChef的Magic跑一遍看它给出的候选。如果都不行考虑是不是自定义编码或者需要密钥。我遇到过一次Base64 解出来是乱码后来发现原文用的是 URL 安全的 Base64把和/换成了-和_换了解码方式就正常了。这种细节题目一般会给提示注意看文件名和注释。5.4 常见问题速查表问题现象可能原因排查方法文件打不开文件头损坏或后缀错误filexxd看真实类型解压报错提取不完整或密码错误dd重新提取检查密码提示流量包异常文件截断或协议非标准跟 TCP 流看原始数据编码乱码编码方式或分隔符错误换解码方式检查分隔符flag 格式不对漏了某层解码或顺序错误重新梳理解码链路5.5 独家避坑经验最后分享几条我复现时总结的经验都是常规文档里不会写的备份原文件。每次修改文件头或提取数据之前先cp一份。改坏了还能重来别在原文件上直接操作。记录每一步的输出。用文本文件把每一步的命令和结果记下来卡住的时候回头看往往能发现哪一步出了问题。别迷信自动工具。binwalk、zsteg、CyberChef的Magic都是辅助结果要自己验证。工具给的是候选不是答案。注意题目给的提示。文件名、注释、字符串里的关键词往往就是解题方向的暗示。我复现时有一道题卡了很久后来发现文件名里的一个单词就是编码方式的提示。多和队友对思路。MISC 题有时候就是一层窗户纸自己钻牛角尖容易卡死和别人聊两句可能就通了。这套复现流程走下来DASCTF 2021 MISC 方向的几道代表性题目基本都能还原。核心还是那句话先体检再拆链路工具辅助手动验证。MISC 没有固定套路但排查思路是通用的练熟了换什么题都不慌。