ARTICLE DETAIL

资讯详情

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

CTF杂项入门:文件识别、分离与合并全攻略

CTF杂项入门:文件识别、分离与合并全攻略 简介CTF竞赛MISC基础解题技能详解是一份面向CTF初学者及安全爱好者的PDF学习资料聚焦杂项题目中最基础也最常用的文件处理能力。文档从杂项概述入手先介绍隐写、压缩包处理、流量分析、攻击取证等常见题型让读者建立整体认知随后重点讲解文件类型识别file命令、010Editor、文件分离Binwalk、foremost、dd、fcrackzip以及010Editor的进阶用法、文件合并Linux的cat、Windows的copy、Python脚本三大核心模块每个模块均配有具体操作步骤和示例并附有独立练习部分帮助巩固所学。资源包含1个PDF文件大小2.2MB目录层级分明按章节逐步推进适合边读边练。目前已有299人学习该资源对于希望系统掌握CTF MISC文件处理基础、快速判断文件类型、从附件中提取隐藏文件并在实际赛题中提升解题效率的学习者而言是一份内容扎实、操作性强的参考资料。1. CTF杂项题从哪下手先过文件识别、分离、合并这三关CTF的MISC杂项题是入门最容易上手、也最容易“看着答案都懂自己动手就卡住”的方向。我前后刷了近两个月的杂项题发现绝大多数题目绕不开三个动作拿到一个没有后缀名的附件先判断它是什么文件发现文件里藏着别的文件想办法分离把一个被拆成多段的文件按正确顺序合并回去。这份《CTF解题技能之MISC基础一》正好把这三件事讲全了适合刚开始接触CTF、想做杂项题却不知道先学什么工具的新手也适合刷过几道题、但对文件头尾和字节偏移还停留在“用过但说不清”状态的人。它解决的不是某个难题而是把杂项题最底层的通用操作串成了一条可复用的流程。2. 文件类型识别file与010Editor先把文件头部的“身份证”读出来拿到附件先别急着找flag先回答一个问题这到底是个什么文件很多杂项题故意不给后缀名或者给一个看似正常的png后缀实际却是zip。判断文件类型有两个思路——用file工具自动识别或者用十六进制编辑器直接看文件头魔数。2.1 file命令一条命令定类型file命令是Linux下最常见的文件类型识别工具。它的原理不依赖后缀名而是读取文件头部的特征字节和内置的magic数据库比对最后输出文件类型。把目标文件复制到Kali里在终端执行file flag.txt file unknown输出类似unknown: PNG image data, 960 x 540, 8-bit/color RGBA这样的结果。看到PNG字样直接把文件后缀改成.png就能正常打开。注意file的识别结果只代表文件头特征不代表文件一定完整也不代表里面没有夹带其他数据这一点在讲分离时会再次提到。我一般会再加一个-b参数去掉文件名只留类型信息方便在脚本里批量处理识别多个文件时用file *。如果file的结果和预期不符别急着改后缀先用十六进制编辑器确认一下。2.2 010Editor十六进制看魔数的底层答案file命令的本质是读头部字节而010Editor就是把这些字节直接摊开给你看。010Editor是一款十六进制编辑器支持无限次undo/redo选中区域可以高亮、保存、复制在CTF里最常用的场景就是查看文件头和文件尾的特征字节。常见的做法是把文件拖进010Editor看第一行十六进制数据。PNG文件开头一定是89 50 4E 47 0D 0A 1A 0A对应ASCII字符是.PNG....JPG开头是FF D8 FF E0或FF D8 FF E1ZIP开头是50 4B 03 04对应字符PK..GIF开头是47 49 46 38即GIF8。这些就是文件魔数相当于文件类型的身份证号。文件头判断不了的时候还可以看文件尾。ZIP文件结尾通常有50 4B 05 06的中央目录结束标记RAR文件以C4 3D 7B 00 40 07 00结尾JPG以FF D9结束PNG的结尾固定是00 00 00 00 49 45 4E 44 AE 42 60 82GIF以3B结束。这些尾部特征在后面讲foremost分离时同样有用因为foremost正是靠着文件头和文件尾的匹配来还原文件的。2.3 常见文件头尾速查表与补后缀实战把最常见的几类文件特征整理成一张速查表做题时对照着看效率比硬背高很多文件类型文件头十六进制文件尾特征JPGFF D8 FF E0 / FF D8 FF E1FF D9PNG89 50 4E 47 0D 0A 1A 0A49 45 4E 44 AE 42 60 82GIF47 49 46 38 37 61 / 39 613BZIP50 4B 03 0450 4B 05 06RAR52 61 72 21 1A 07 00C4 3D 7B 00 40 07 00PDF25 50 44 46末端%%EOFELF7F 45 4C 46无固定尾部实际做题场景是这样的附件叫misc100没后缀file提示data说明file的magic库没命中这时候就用010Editor打开看头部。如果发现FF D8 FF E0先把后缀改成.jpg看看能不能正常打开。能打开就进入下一步——右键查看属性、用strings搜字符串、用binwalk扫描有没有隐藏文件。改后缀失败也不要灰心尾部特征也许能透露更多信息比如一个文件头看着像PNG尾部却出现了ZIP的中央目录标记那就要考虑文件拼接隐藏了。3. 自动化文件分离Binwalk扫描与foremost兜底文件类型确认了下一步是看看这个文件里有没有藏着别的东西。杂项题最常见的出题手法是把flag文件拼到一张图片后面篡改一下文件头或者直接在正常文件的末尾追加另一段压缩包数据。手动去翻十六进制找边界非常费眼所以先上自动化工具。3.1 Binwalk一发扫描让隐藏文件现身Binwalk是一个固件分析工具但它扫描文件内嵌数据的能力在CTF里用得更多。它会把目标文件从头到尾扫一遍根据文件中每个偏移位置的特征字节识别出可疑的文件类型并列出清单。file命令只能告诉你整个文件最像什么Binwalk却能告诉你文件里面在什么偏移位置还有什么。在Kali里安装apt-get update apt-get install binwalk如果是Debian系老版本可能需要加上--unzip参数辅助解压但Kali自带的版本直接支持提取。扫描命令很简单binwalk flag.jpg扫描结果会输出一张表每一行包含DECIMAL十进制偏移、HEXADECIMAL十六进制偏移和DESCRIPTION识别出的文件类型描述。比如一张看似正常的jpg扫描后可能出现DECIMAL HEXADECIMAL DESCRIPTION 0 0x0 JPEG image data, JFIF standard 1.01 185430 0x2D45E Zip archive data, at least v2.0 to extract这时就很明确了图片尾部还挂着一个ZIP压缩包偏移在185430字节处。3.2 Binwalk提取-e参数与_extracted目录扫描只能看到结果真正干活的是提取binwalk -e flag.jpg-e等同于--extract它会根据扫描到的文件类型从目标文件中把内嵌数据抽取出来。执行成功后当前目录下会生成一个_flag.jpg_extracted的文件夹里面按偏移位置放着提取出来的文件。多数情况下ZIP、RAR、PNG这些常见格式都能直接抽出来。这里有个参数选择的问题binwalk flag.jpg只扫描binwalk -e flag.jpg扫描并提取提取失败时还有binwalk -e -dd.*:extracted这种强行抽所有块的写法。我习惯先只说scan看一遍偏移再决定要不要提取。为什么要看偏移因为如果隐藏文件只截取了一部分binwalk照样能识别出偏移但提取出来的文件是缺内容的提前看偏移能帮你判断文件是完整追加还是被裁剪。3.3 foremost按文件头和文件尾特征还原Binwalk提取失败的时候换个工具试试——foremost是专门做文件雕复carving的。它不是靠扫描文件系统结构而是拿着每种文件的头部和尾部特征去目标文件里做匹配匹配到一组头尾就把中间的数据切出来另存为文件。默认支持19种常见类型包括jpg、png、gif、zip、doc、pdf等也可以通过它的配置文件扩展。在Kali安装apt-get install foremost使用命令foremost flag.jpg -o output_dir-o指定输出目录执行成功后会在目标目录下生成output_dir里面按照识别出的类型分好了子目录比如png/、zip/、jpg/。注意foremost的输出目录不能事先存在否则会报错我一开始不知道这个限制连续跑了几次都是提示output directory exists后来才发现要先删掉旧目录或者换个名字。3.4 两类工具的选型思路什么时候用谁对比项Binwalkforemost识别方式扫描文件内嵌的完整文件签名匹配头部尾部特征切片还原输出形式按偏移提取到_extracted目录按文件类型分目录存放适用场景文件内部夹带完整格式数据文件碎片缺失、无文件系统、binwalk提取失败对残缺文件的处理能识别但提取出的文件可能打不开可能还原出部分可用的文件内容选型理由很简单Binwalk优先因为它扫得准、偏移信息清晰Binwalk不行就上foremost。但两个工具都拿不到结果时就得进入下一章的半自动和手动分离思路了比如直接用dd按字节偏移切割或者拿010Editor手动圈选范围另存。我刷题时见过最折腾的情况是binwalk扫出一个ZIP提取出来却提示损坏用foremost恢复出的还是一个损坏的ZIP最后手工翻十六进制才发现是文件头被改了一个字节ZIP文件最前面的PK字符被换成了别的。4. 手动文件分离与压缩包处理dd、010Editor、fcrackzip的精确操作自动化工具解决的是特征明显、结构完整的情况。出题人稍微动点手脚——把文件头篡改、在文件中间插入干扰数据、把一个文件切割成几段——binwalk和foremost就会失灵。这时候需要具备手工操作的能力最常用的是dd命令按字节切割、010Editor手动保存范围以及fcrackzip处理加密压缩包。4.1 dd按字节偏移精确截取dd是一个底层的文件复制工具它能从输入文件指定位置开始读取指定长度的数据写入到另一个文件。在文件分离场景下公式固定为dd if源文件 bs1 skip开始偏移量 of输出文件参数含义if指定输入文件名of指定输出文件名bs1表示每块大小为1字节skip表示从输入文件开头跳过多少个块后再开始复制。因为bs设成了1skip的值就是跳过的字节数。举个例子IDF实验室“抓到一只苍蝇”那道题flag藏在文件的前364个字节之后需要把前面的无用数据去掉dd ifs1 bs1 skip364 ofd1执行后d1就是从第365个字节开始截取的内容再对d1做file判断就能识别出真身。这里有个容易算错的地方十六进制编辑器里显示的偏移是十六进制比如在010Editor里看到偏移0x16C要先用计算器转成十进制364再填进skip。我踩过这个坑直接把0x16C当成364用切割出来的文件全是乱的。4.2 010Editor手动选择并保存兜底方案当偏移位置不明确或者要分离的内容不是从固定偏移开始而是从一个特征签名开始、到另一个特征签名结束时纯靠dd要算半天010Editor的手动操作反而直观。步骤是在十六进制区找到目标文件的起始位置点击一下锚定起点滚动到目标文件的结束位置按住Shift点击终点右键选择“选择”并“保存选择”然后根据内容手动补上后缀名。这种手动方式的理解成本低但遇上百兆以上的文件就很吃力。我一般只有两种情况下会用010Editor分离一是文件只有几十KB、偏移很好定位二是binwalk识别出错、我知道目标特征但不知道偏移先用010Editor的搜索功能定位到特征字符串比如搜PK再选择保存。010Editor的搜索框支持直接搜ASCII和十六进制搜50 4B 03 04定位ZIP头很方便。4.3 fcrackzip压缩包密码的字典与暴力破解从图片里分离出ZIP文件后打开又遇到密码这时候用到fcrackzip。它是Linux下的ZIP压缩包密码破解工具支持字典模式、暴力枚举模式和指定字符集破解。安装apt-get install fcrackzip常见用法fcrackzip -b -c aA1 -l 1-6 -u flag.zip参数说明-b指定暴力破解模式-c指定字符集a是小写字母A是大写字母1是数字-l 1-6表示密码长度范围1到6位-u表示过滤掉错误的密码通过尝试解压来验证。如果题目提示有密码字典改用字典模式fcrackzip -D -p rockyou.txt -u flag.zip-D指定字典模式-p指定字典文件路径。Kali自带rockyou字典路径在/usr/share/wordlists/rockyou.txt.gz先解压再用。暴力破解速度取决于机器性能和ZIP加密算法纯数字短密码几秒钟就能出来含大小写字母和符号的6位以上密码可能要跑很长时间所以做题时优先找线索实在没有线索再用字典。5. 避坑记录文件类型识别、分离与合并的常见问题这部分是我整理资料时最想扩展的内容。original文档把命令都列出来了但真正做题时卡住的往往不是命令本身而是细节。以下四条都是我自己或身边人翻过的车按“现象→原因→解决”记录如下。5.1 识别误判file显示PNG图片却打不开现象file命令识别出PNG把后缀改成.png后双击无法打开用010Editor打开看到前半部分是PNG头中间出现了大量非PNG数据块。原因file只读取头部特征字节判定标准是前几个字节匹配PNG魔数但文件实际内容可能被篡改过或者PNG关键块IHDR、IDAT被剪切/替换。也有的题目故意把ZIP数据拼接在PNG后面file依然会识别为PNG因为头部特征没变。解决先用010Editor检查PNG的IHDR块——PNG文件的第2个块就是IHDR包含宽度、高度、位深等信息尺寸异常直接导致图片打不开。再拉到最后看IEND块是否存在缺少IEND说明文件不完整。另外养成习惯任何file识别的结果都只在解题流程中当作第一判断不当作最终结论后续binwalk和十六进制检查要跟上。5.2 提取失败binwalk -e 后_extracted目录是空的现象binwalk正常扫描出了ZIP文件偏移执行提取命令后确实生成了_extracted目录但目录里什么都没有或者只有一个空文件夹。原因binwalk的提取依赖系统的外部工具集比如提取ZIP时需要unzip提取某些固件时需要sasquatch等专用脚本。环境缺少相应工具时binwalk不会报错只是静默跳过。另外文件被二次修改过比如ZIP头部的PK字节被改掉binwalk扫描能匹配到部分特征但提取工具库无法正确重组。解决先确认系统装了哪些解压工具缺什么补什么扫描时加-I参数忽略某些弱匹配减少干扰提取不出来的可以用foremost或dd按扫描结果给出的偏移手动切割比如binwalk显示ZIP在偏移0x2D45E那就用dd从这个偏移往后截取dd ifflag.jpg bs1 skip185430 ofhidden.zip截取出的ZIP如果还打不开检查文件头是不是被修改过用010Editor把文件头修正回50 4B 03 04再尝试解压。5.3 分离后文件损坏图片尾部多出数据但它不是图片的一部分现象用binwalk从jpg中提取出zipzip可以正常显示文件列表但解压时报CRC错误或者解出的文件大小不对。原因装载这个zip的载体文件jpg本身就是不完整的或者zip在嵌入时被从中间截断——比如出题人把zip切成两半第一半藏在图片A尾部第二半藏在图片B尾部。通常这类题目会配合文件名或题目描述给提示比如出现两个大小极接近的图片文件或者文件名暗示part1/part2。解决解压报CRC错误时把zip旁边同目录下所有二进制数据都做一次binwalk扫描看有没有另一个zip或同一zip的残余部分。有残余就先把两段数据拼接后再解压拼接顺序先看时间戳再试文件名。总之遇到损坏zip不要把时间花在修zip上优先考虑是不是要和其他文件合并。5.4 合并乱序cat命令合并不按预想顺序现象用cat把若干分片合并后发现文件打开乱码检查单个分片却都正常。原因cat默认按命令行参数顺序读取文件但在实际CTF场景中分片可能被命名为2.txt、10.txt、1.txt这种字符串排序和数字排序不一致的名字。用cat *.txt all时shell按字母序展开10.txt会排在2.txt前面。另一个常见原因是分片里有换行或文件末尾附加了干扰字节直接拼接时引入了空数据。解决合并前先手动确认分片顺序或者统一重命名为带前导零的名称01、02、10再用通配符合并。合并后必须验证先用file确认输出类型再ls -l对比总大小是否等于所有分片大小之和必要时用010Editor跳到文件尾确认最后一段的内容是目标文件的正常结束标记。6. 文件合并与一条验证习惯cat、copy与Python的收尾闭环文件分离讲得多合并反而容易被忽略。但在分片题和文件修复题里合并是把零散线索变回可用文件的关键一步。三种合并方式覆盖两个平台Linux下的cat、Windows下的copy以及跨平台的Python脚本。Linux下按顺序合并cat chapter01 chapter02 chapter03 book cat chapter* book第一条是显式按参数顺序拼接三个文件第二条是把所有以chapter开头的文件按字母排序拼接后输出到book。Windows下用copy注意加/B参数表示按二进制模式合并不加/B可能会被当成文本文件处理导致数据被转换损坏copy /B chapter01chapter02chapter03 bookPython脚本的好处是不依赖系统命令而且能在合并前对文件做预处理——比如判断文件是否为空、跳过特定字节。以下是一个最简合并脚本#!/usr/bin/env python3 import sys parts [chapter01, chapter02, chapter03] with open(book, wb) as out: for name in parts: with open(name, rb) as f: out.write(f.read())逻辑很直接按parts列表里的顺序逐个打开文件以二进制模式读取全部内容写入目标文件。参数调整主要在parts列表——如果分片多可以直接用glob按某种规则取文件名做一次排序再合并。合并完之后我现在的习惯是强制走一遍验证file book看类型是否恢复ls -l对比合并后字节数是否等于分片总和然后打开看关键位置的十六进制是否连续。这三个动作加起来不过十秒但能挡掉绝大多数合并翻车。也就是从那以后我不再相信“用cat合并了就等于完成了”每次合并都有意地多做一次file和ls的校验。希望这套工具组合和踩坑记录能帮你在下次CTF杂项题里少走几步弯路。本文还有配套的精品资源点击获取
返回列表