1. 压缩包不只是“打包”:从文件结构看隐写空间
很多人对压缩包的理解停留在“把一堆文件压成一个小包,方便传输”这个层面。但如果你接触过CTF里的Misc方向,或者做过电子数据取证相关的工作,就会知道压缩包本身就是一个天然的隐写容器。它的文件结构里藏着大量可以“做手脚”的地方,而这些地方往往不会影响正常的解压流程,普通用户根本察觉不到。
先说说压缩包的基本结构。以最常见的ZIP格式为例,一个ZIP文件由三部分组成:本地文件头(Local File Header)、文件数据(File Data)和中央目录(Central Directory)。每个被压缩的文件都有一个本地文件头,记录了文件名、压缩方法、CRC-32校验值、压缩前后大小等信息。中央目录则像是整本书的目录页,记录了所有文件的索引信息,位于文件末尾。最后还有一个中央目录结束记录(End of Central Directory Record,EOCD),标记整个压缩包的结束。
这个结构里,隐写的切入点非常多。比如,本地文件头和文件数据之间可以插入额外数据,解压时大多数工具会直接跳过这些“垃圾数据”;中央目录和EOCD之间也可以塞东西;甚至EOCD之后还可以追加数据,很多解压软件根本不会去读EOCD之后的内容。更隐蔽的做法是修改本地文件头里的某些字段,比如把文件名长度字段改大,让解压软件读取文件名时多读几个字节,这几个字节就可以用来藏信息。
我最早接触压缩包隐写是在一道CTF题目里,给了一个看似普通的ZIP文件,解压出来是一张图片,但图片打不开。用十六进制编辑器一看,图片文件头被改了几个字节。当时我以为只是文件头损坏,修复之后发现图片能正常显示,但题目要求找flag,说明信息不在图片本身,而是在压缩包的某个结构字段里。后来用binwalk一跑,发现ZIP的中央目录区域有一段异常数据,提取出来才拿到flag。那次经历让我意识到,压缩包隐写不是“把文件藏进压缩包”这么简单,而是利用压缩包格式本身的冗余空间和解析特性来藏信息。
从取证的角度看,压缩包隐写的检测难度比图片隐写要高一些。图片隐写通常有固定的分析套路,比如LSB分析、频域分析、调色板分析等,工具也比较成熟。但压缩包隐写没有统一的“一键检测”工具,需要根据具体的隐写手法来选择分析路径。这也是为什么在Misc和取证类题目里,压缩包隐写往往作为“组合拳”出现——先让你解压,再让你分析解压出来的文件,最后发现真正的信息藏在压缩包本身的结构里。
提示:如果你拿到一个压缩包,解压后文件内容看起来完全正常,但题目或任务明确要求找隐藏信息,优先怀疑压缩包本身的结构字段,而不是解压出来的文件。
2. 压缩包隐写的几种主流手法与识别思路
压缩包隐写的手法可以大致分为几类:结构字段篡改、冗余空间插入、伪加密、多压缩包嵌套和密码爆破。每一类的原理和识别思路都不一样,下面逐一拆解。
2.1 结构字段篡改:改几个字节就能藏信息
ZIP格式的本地文件头里有很多字段可以被篡改而不影响解压。比如文件名长度(File Name Length)字段,正常值是文件名的实际字节数,但如果把它改大,解压软件会多读几个字节作为文件名的一部分。这几个多出来的字节就可以用来藏信息。类似地,扩展字段长度(Extra Field Length)也可以被利用,扩展字段本来是给ZIP格式预留的扩展空间,很多解压软件会忽略它的内容,所以往里面塞数据非常隐蔽。
还有一种做法是修改压缩方法(Compression Method)字段。ZIP支持多种压缩方法,比如Store(不压缩)、Deflate、Bzip2等。如果把压缩方法改成一个不常用的值,某些解压软件可能会报错,但另一些软件会尝试用默认方法解压,解压出来的内容可能就不一样了。这种手法在CTF里被称为“压缩方法隐写”,需要对比不同解压软件的行为差异。
识别这类隐写,最直接的方法是对比十六进制。拿一个正常的ZIP文件和可疑ZIP文件做二进制对比,看哪些字段的值异常。比如文件名长度字段的值明显大于实际文件名长度,或者扩展字段长度异常大,这些都是明显的信号。另一个方法是用多个解压软件交叉验证,如果不同软件解压出来的结果不一致,说明压缩包结构被改过。
2.2 冗余空间插入:EOCD之后的秘密
ZIP文件的EOCD之后可以追加任意数据,很多解压软件在解析完EOCD之后就认为文件结束了,不会去读后面的内容。这就给隐写提供了绝佳的空间。你可以把一段文本、一张图片、甚至另一个压缩包直接追加到ZIP文件末尾,文件大小会变大,但解压行为完全正常。
这种手法的识别非常简单:看文件大小。如果一个ZIP文件的实际大小明显大于它内部所有文件压缩后的大小之和,那EOCD之后很可能有追加数据。用binwalk或者foremost这类工具可以直接把追加的数据提取出来。更精确的做法是用十六进制编辑器找到EOCD的结束位置(通常是0x06054b50标记之后的22字节),然后看后面还有没有数据。
还有一种更隐蔽的做法是在本地文件头和文件数据之间插入数据。ZIP格式允许本地文件头之后、文件数据之前存在额外的数据,解压软件会跳过这些数据直接读文件数据。这种插入方式不会改变文件的总大小(因为插入的数据占用了原本的压缩数据空间),所以单纯看文件大小发现不了。识别方法是对比压缩前后的大小:如果压缩包内某个文件的压缩后大小和实际数据大小对不上,中间可能插了东西。
2.3 伪加密:改一个标志位就能骗过解压软件
伪加密是CTF里非常经典的一种压缩包隐写手法。ZIP格式的本地文件头和中央目录里都有一个通用位标志(General Purpose Bit Flag)字段,其中第0位表示文件是否加密。如果把这一位设为1,解压软件就会认为文件被加密了,弹出密码输入框。但实际上文件数据并没有真正加密,只是标志位被改了。
伪加密的识别方法是对比本地文件头和中央目录里的标志位。正常情况下,这两个地方的标志位应该是一致的。如果本地文件头里标志位是0(未加密),但中央目录里标志位是1(加密),或者反过来,那就是伪加密。修复方法也很简单:把标志位改回0,或者用zip -FF命令修复压缩包结构。
注意:伪加密和真加密的区别在于,真加密的文件数据是用密码加密过的,没有密码无法解压;伪加密只是标志位被改,文件数据本身没有加密,改回标志位就能正常解压。
2.4 多压缩包嵌套:套娃式的信息隐藏
多压缩包嵌套是指一个压缩包里包含另一个压缩包,另一个压缩包里再包含一个压缩包,层层嵌套。这种手法本身不算严格的“隐写”,但在CTF和取证场景里经常和隐写结合使用。比如,外层压缩包解压出来是一张图片,图片的文件末尾追加了一个ZIP文件,把追加的ZIP提取出来再解压,里面才是真正的flag。
识别嵌套压缩包的方法是用binwalk扫描。binwalk可以自动识别文件中的多个文件签名,如果扫描结果里出现多个ZIP、RAR、7z等压缩包签名,说明存在嵌套。另一个方法是手动检查文件末尾,很多嵌套压缩包是直接追加在文件末尾的,用十六进制编辑器看文件最后几个字节,如果有PK(ZIP的文件签名)或者Rar!(RAR的文件签名),基本可以确定有嵌套。
2.5 密码爆破:弱密码和字典攻击
如果压缩包是真加密,那就需要密码才能解压。CTF里的密码通常是弱密码,比如数字、常见单词、题目相关的字符串等。爆破工具首选John the Ripper和hashcat,这两个工具都支持ZIP、RAR、7z等格式的密码爆破。
爆破之前需要先把压缩包的哈希提取出来。对于ZIP文件,可以用zip2john工具生成哈希文件,然后交给John或hashcat爆破。对于RAR文件,用rar2john;对于7z文件,用7z2john。爆破的效率和字典质量直接相关,CTF里常用的字典有rockyou.txt、darkc0de.txt等。如果字典爆破不出来,可以尝试掩码攻击,比如知道密码是4位数字,就用?d?d?d?d作为掩码,爆破速度会快很多。
| 压缩格式 | 哈希提取工具 | 爆破工具 | 常用字典 |
|---|---|---|---|
| ZIP | zip2john | John/hashcat | rockyou.txt |
| RAR | rar2john | John/hashcat | darkc0de.txt |
| 7z | 7z2john | John/hashcat | rockyou.txt |
3. 实战排查链路:从拿到压缩包到提取隐藏信息
这一节用一个模拟场景来完整走一遍排查链路。假设你拿到一个名为suspicious.zip的文件,任务要求找出隐藏信息。下面是我在实际操作中常用的排查步骤,每一步都说明为什么这样做,以及可能遇到的情况。
3.1 第一步:基础信息收集与文件类型确认
拿到文件后,先别急着解压。第一步是确认文件类型。用file命令查看文件的真实类型:
file suspicious.zip如果输出是Zip archive data,说明确实是ZIP文件。如果输出是data或者其他类型,说明文件头可能被改了,需要进一步分析。有时候出题人会故意把ZIP文件的后缀改成.jpg或者.txt,但文件头还是PK,用file命令就能识别出来。
接下来用ls -la查看文件大小,用xxd或hexdump查看文件头几个字节:
xxd suspicious.zip | head -20正常的ZIP文件开头应该是50 4B 03 04(即PK\x03\x04)。如果开头不是这个,说明文件头被篡改过,需要先修复文件头。修复方法是找到正确的文件签名,把前面的垃圾数据删掉,或者把文件头改回正确的值。
3.2 第二步:binwalk扫描与嵌套检测
确认是ZIP文件后,用binwalk扫描整个文件:
binwalk suspicious.zipbinwalk会列出文件中所有识别到的文件签名。如果扫描结果里出现多个Zip archive data,说明存在嵌套压缩包。如果出现PNG image、JPEG image等图片签名,说明压缩包里可能藏了图片。如果出现MySQL、Redis等数据库相关的签名,可能是误报,需要结合上下文判断。
binwalk的扫描结果里会显示每个签名的偏移地址。如果某个签名的偏移地址在文件末尾附近,而且文件大小明显大于正常ZIP文件,那很可能是EOCD之后追加的数据。可以用dd命令把追加的数据提取出来:
dd if=suspicious.zip of=appended.bin bs=1 skip=<偏移地址>提取出来的appended.bin再用file命令确认类型,如果是图片就打开看,如果是另一个压缩包就继续解压。
3.3 第三步:解压测试与伪加密识别
用unzip尝试解压:
unzip suspicious.zip如果提示需要密码,先别急着爆破,先检查是不是伪加密。用十六进制编辑器打开ZIP文件,找到本地文件头和中央目录里的通用位标志字段。本地文件头的位置在文件开头,标志字段的偏移是第6-7字节;中央目录的位置在文件末尾附近,标志字段的偏移是第8-9字节。如果这两个地方的值不一致,比如本地文件头是00 00,中央目录是01 00,那就是伪加密。
修复伪加密的方法是用zip -FF命令重建压缩包:
zip -FF suspicious.zip --out fixed.zip-FF参数会尝试修复压缩包结构,把不一致的标志位修正。修复后的fixed.zip应该可以正常解压,不需要密码。
如果修复后仍然需要密码,那就是真加密,需要进入密码爆破流程。
3.4 第四步:密码爆破与字典选择
真加密的ZIP文件,先用zip2john提取哈希:
zip2john suspicious.zip > hash.txt然后用john爆破:
john --wordlist=rockyou.txt hash.txt如果rockyou.txt爆破不出来,可以尝试用hashcat的掩码攻击。比如知道密码是6位数字:
hashcat -m 17200 -a 3 hash.txt ?d?d?d?d?d?d-m 17200是ZIP格式的哈希模式,-a 3是掩码攻击,?d表示数字。掩码攻击的速度比字典攻击快很多,但前提是知道密码的格式。
提示:CTF里的密码通常是题目相关的字符串,比如题目名、作者名、flag格式的前缀等。爆破之前先试试这些“弱密码”,能省不少时间。
3.5 第五步:结构字段分析与十六进制对比
如果解压出来的文件看起来正常,但任务要求找隐藏信息,那就需要回到压缩包本身,分析结构字段。最有效的方法是找一个正常的ZIP文件做对比。用同样的工具压缩同样的文件,生成一个“干净”的ZIP文件,然后用xxd对比两个文件的十六进制差异。
xxd suspicious.zip > suspicious.hex xxd clean.zip > clean.hex diff suspicious.hex clean.hex差异的地方就是可能被篡改的字段。重点关注文件名长度、扩展字段长度、压缩方法、CRC-32校验值这几个字段。如果某个字段的值明显异常,比如文件名长度是100但实际文件名只有10个字符,那多出来的90个字节就是隐藏信息。
另一种方法是用zipinfo查看压缩包的详细信息:
zipinfo -v suspicious.zipzipinfo -v会列出每个文件的详细结构信息,包括本地文件头和中央目录的字段值。如果某个字段的值和预期不符,比如压缩方法显示为unknown,或者扩展字段长度异常大,那就是隐写的信号。
4. 工具链与实操技巧:我常用的压缩包分析组合
压缩包隐写分析没有“一招鲜”的工具,需要根据具体情况组合使用。下面是我在实际操作中常用的工具链,以及一些提高效率的技巧。
4.1 基础工具:file、xxd、binwalk、foremost
file命令用于快速确认文件类型,xxd用于十六进制查看和编辑,binwalk用于自动扫描文件签名,foremost用于提取文件中的嵌入数据。这四个工具基本覆盖了压缩包隐写分析的入门需求。
binwalk的用法很灵活,除了基本的扫描,还可以用-e参数自动提取扫描到的文件:
binwalk -e suspicious.zip-e参数会把扫描到的所有文件提取到_suspicious.zip.extracted目录下。但要注意,binwalk的自动提取有时候会误报,提取出来的文件可能不完整,需要手动验证。
foremost的用法更简单:
foremost -i suspicious.zip -o output_dirforemost会根据文件签名自动提取文件,适合处理嵌套压缩包和追加数据。但foremost的缺点是它只认文件签名,如果数据被加密或者压缩过,就提取不出来。
4.2 压缩包专用工具:zipinfo、zipdetails、7z
zipinfo用于查看ZIP文件的详细结构信息,zipdetails是Perl写的一个工具,能更详细地解析ZIP文件的每个字段,包括本地文件头和中央目录的原始值。7z是一个万能压缩工具,支持ZIP、RAR、7z、tar等多种格式,而且它的错误提示比unzip更详细,有时候unzip报错但7z能正常解压。
zipdetails的用法:
zipdetails suspicious.zip它会逐字节解析ZIP文件的结构,输出每个字段的名称、偏移、长度和值。如果某个字段的值异常,比如文件名长度和实际文件名不匹配,zipdetails的输出里会很明显地显示出来。
7z的用法:
7z x suspicious.zip7z的x参数表示解压并保留目录结构。如果7z解压时报错,可以加-y参数强制覆盖,或者用7z l先列出压缩包内容:
7z l suspicious.zip4.3 密码爆破工具:John、hashcat、fcrackzip
John the Ripper和hashcat是密码爆破的两大主力,fcrackzip是专门针对ZIP文件的爆破工具,用法更简单但功能相对有限。
fcrackzip的用法:
fcrackzip -u -D -p rockyou.txt suspicious.zip-u表示用unzip验证密码,-D表示字典攻击,-p指定字典文件。fcrackzip的优点是速度快,缺点是只支持ZIP格式,而且不支持掩码攻击。
hashcat的掩码攻击功能非常强大,除了数字掩码,还支持自定义字符集。比如知道密码是4位小写字母:
hashcat -m 17200 -a 3 hash.txt ?l?l?l?l?l表示小写字母。如果知道密码是“flag”开头的字符串,可以用混合掩码:
hashcat -m 17200 -a 3 hash.txt flag?s?s?s?s?s表示特殊字符。掩码攻击的关键是准确判断密码的格式,格式判断对了,爆破速度会快几个数量级。
4.4 十六进制编辑器:010 Editor、HxD、wxHexEditor
十六进制编辑器是压缩包隐写分析的必备工具。010 Editor功能最强大,支持模板解析,可以自动识别ZIP、PNG、JPEG等格式的结构;HxD是Windows平台上的轻量级编辑器,启动快,适合快速查看;wxHexEditor是跨平台的,支持大文件编辑。
我个人的习惯是用010 Editor做精细分析,用HxD做快速查看。010 Editor的模板功能特别适合分析压缩包结构,加载ZIP模板后,每个字段的名称、偏移、长度、值都会以树形结构显示,修改字段值后还能实时看到文件结构的变化。
注意:修改压缩包结构字段之前,一定要先备份原始文件。有些修改是不可逆的,改错了可能导致压缩包彻底损坏。
5. 避坑指南:压缩包隐写分析中的常见误区
压缩包隐写分析有几个常见的坑,踩过一次之后就会印象深刻。下面是我在实际操作中总结的几个误区,以及对应的正确做法。
5.1 误区一:拿到压缩包就急着解压
很多人拿到压缩包的第一反应是双击解压,看到解压出来的文件就以为任务完成了。但在CTF和取证场景里,解压出来的文件往往只是“障眼法”,真正的信息藏在压缩包本身的结构里。正确的做法是先分析压缩包本身,用file、binwalk、xxd等工具确认文件类型和结构,然后再解压。
我见过一道题目,压缩包解压出来是一张图片,图片能正常打开,但题目要求找flag。很多人把图片分析了一遍,LSB、频域、调色板都试了,没找到。最后发现flag藏在压缩包的中央目录里,用zipdetails一看就出来了。如果一开始就分析压缩包结构,能省很多时间。
5.2 误区二:忽略文件大小异常
文件大小是压缩包隐写最直观的信号。如果一个ZIP文件的实际大小明显大于它内部所有文件压缩后的大小之和,那EOCD之后很可能有追加数据。但很多人只看解压出来的文件,不关注压缩包本身的大小,导致漏掉追加数据。
正确的做法是对比压缩包大小和内部文件大小。用zipinfo -l可以列出每个文件的压缩前后大小:
zipinfo -l suspicious.zip把所有文件的压缩后大小加起来,再加上中央目录和EOCD的大小(通常是几百字节),如果和压缩包的实际大小差距很大,说明有追加数据。
5.3 误区三:伪加密当成真加密去爆破
伪加密和真加密的表现都是“解压需要密码”,但伪加密只需要改一个标志位就能解压,不需要爆破。很多人看到密码输入框就开始跑字典,跑了几小时没结果,最后发现是伪加密。
区分伪加密和真加密的方法是看文件数据是否被加密。用十六进制编辑器打开ZIP文件,找到文件数据区域,如果数据看起来是随机的(高熵),说明是真加密;如果数据看起来有规律(比如全是00或者有明显的文本模式),说明是伪加密。另一个方法是对比本地文件头和中央目录的标志位,如果不一致,基本可以确定是伪加密。
5.4 误区四:字典选择不当导致爆破失败
密码爆破的成功率很大程度上取决于字典的质量。CTF里常用的rockyou.txt有1400多万条密码,覆盖了大部分弱密码,但如果密码是题目相关的字符串,rockyou.txt里可能没有。这时候需要根据题目信息生成自定义字典。
比如题目名是easy_zip,可以生成一个包含easy_zip、easyzip、easy_zip123、easy_zip2024等变体的字典。如果题目描述里提到了某个日期、人名、地名,也把这些信息加入字典。自定义字典的规模不用很大,几百到几千条就够了,关键是覆盖可能的密码。
5.5 误区五:忽略压缩包的版本差异
ZIP格式有多个版本,不同版本的结构字段可能略有差异。比如ZIP 2.0引入了扩展字段,ZIP 6.3引入了更强的加密算法。如果用旧版本的工具分析新版本的压缩包,可能会漏掉一些字段。
正确的做法是用支持最新ZIP标准的工具,比如7z、zipdetails、010 Editor的最新版本。这些工具能正确解析ZIP 6.3的加密字段和扩展字段,避免因为版本差异导致分析遗漏。
| 误区 | 表现 | 正确做法 |
|---|---|---|
| 急着解压 | 只分析解压出来的文件 | 先分析压缩包本身的结构 |
| 忽略文件大小 | 不看压缩包实际大小 | 对比压缩包大小和内部文件大小之和 |
| 伪加密当真加密 | 跑字典几小时没结果 | 先检查标志位是否一致 |
| 字典选择不当 | 爆破失败 | 根据题目信息生成自定义字典 |
| 忽略版本差异 | 漏掉新版本字段 | 用支持最新ZIP标准的工具 |
6. 从CTF到取证:压缩包隐写的实际应用场景
压缩包隐写不只是CTF里的“游戏”,在电子数据取证、恶意代码分析、数据恢复等实际场景里也有广泛应用。理解这些应用场景,能帮助你更好地把握压缩包隐写分析的重点和方向。
6.1 CTF竞赛中的Misc方向
CTF里的Misc方向是压缩包隐写的主战场。题目通常给一个压缩包,要求找出flag。flag可能藏在压缩包的结构字段里、追加数据里、嵌套压缩包里,或者需要爆破密码才能拿到。Misc题目的特点是“脑洞大”,出题人会想尽办法把信息藏在你意想不到的地方。
做Misc题目的关键是不要放过任何细节。文件大小、文件时间戳、文件名、压缩包注释、扩展字段,这些看起来不起眼的地方都可能是藏信息的地方。我见过一道题目,flag藏在压缩包的注释字段里,用zipinfo -z就能看到:
zipinfo -z suspicious.zip-z参数会显示压缩包的注释内容。这个字段很多工具默认不显示,容易被忽略。
6.2 电子数据取证中的文件分析
在电子数据取证中,压缩包隐写分析用于检测嫌疑人是否通过压缩包隐藏了非法文件或信息。取证场景和CTF的区别在于,取证更注重证据的完整性和可复现性,分析过程需要详细记录,提取出来的数据需要做哈希校验。
取证场景下,压缩包分析通常遵循以下流程:先做镜像备份,确保原始数据不被修改;然后用binwalk、foremost等工具做初步扫描;接着用zipdetails、010 Editor做精细分析;最后把提取出来的数据做哈希校验,生成分析报告。
提示:取证场景下,所有操作都要在备份文件上进行,原始文件不能直接修改。提取出来的数据要计算MD5或SHA-256哈希值,作为证据完整性的证明。
6.3 恶意代码分析中的压缩包检测
恶意代码经常用压缩包来打包和隐藏自身,比如把恶意可执行文件压缩后追加到正常文件末尾,或者用多层嵌套压缩包来绕过杀毒软件的检测。分析这类样本时,压缩包隐写分析的技能就派上用场了。
恶意代码分析中的压缩包检测重点是识别异常结构和提取隐藏载荷。异常结构包括:压缩包大小异常、包含多个压缩包签名、压缩方法异常、文件名包含特殊字符等。提取隐藏载荷的方法和CTF类似,用binwalk扫描、用dd提取、用7z解压。但要注意,恶意代码的压缩包可能带有密码,而且密码可能是随机生成的,爆破难度很大。这时候需要结合动态分析,在沙箱里运行样本,监控它的解压行为,从内存中提取解密后的载荷。
6.4 数据恢复中的压缩包修复
数据恢复场景下,压缩包可能因为磁盘损坏、传输错误等原因导致结构损坏,无法正常解压。这时候需要用压缩包修复工具来恢复数据。常用的修复工具包括zip -FF、7z的修复模式、DiskInternals ZIP Repair等。
zip -FF的修复原理是重建中央目录。如果中央目录损坏但本地文件头完好,zip -FF可以根据本地文件头重新生成中央目录,从而恢复压缩包。如果本地文件头也损坏了,那就需要更高级的修复工具,比如010 Editor的手动修复,或者用binwalk提取出文件数据后手动重建压缩包。
修复压缩包的关键是保留原始数据。修复过程中不要覆盖原始文件,修复后的文件要另存为新的文件名。如果修复失败,原始文件还在,可以尝试其他修复方法。
7. 个人实操体会与进阶方向
压缩包隐写这个领域,入门容易精通难。入门只需要掌握几个基本工具和常见手法,但要做到“看到压缩包就知道从哪里下手”,需要大量的实操积累。我自己的体会是,多做题、多复盘、多总结是提高分析能力的最有效途径。
每次分析完一个压缩包隐写题目,我都会把分析过程记录下来,包括用了哪些工具、遇到了什么问题、最后是怎么解决的。这些记录在遇到类似题目时非常有用,能帮你快速定位分析方向。比如,如果题目给的压缩包解压出来是一张图片,但图片打不开,那大概率是文件头被改了;如果压缩包大小异常,那大概率有追加数据;如果解压需要密码但标志位不一致,那大概率是伪加密。
进阶方向有几个:一是深入学习ZIP、RAR、7z等格式的底层结构,理解每个字段的含义和可能的篡改方式;二是掌握密码学基础知识,理解ZIP加密算法的原理和弱点;三是学习自动化分析工具的开发,用Python写脚本自动扫描压缩包的异常结构,提高分析效率。
Python的zipfile模块可以用来读取ZIP文件的结构信息,结合struct模块可以解析二进制字段。比如,下面这段代码可以列出ZIP文件中每个文件的本地文件头信息:
import zipfile import struct with open('suspicious.zip', 'rb') as f: data = f.read() # 查找本地文件头签名 PK\x03\x04 offset = 0 while True: offset = data.find(b'PK\x03\x04', offset) if offset == -1: break # 解析本地文件头 header = data[offset:offset+30] fields = struct.unpack('<IHHHHHIIIHH', header) print(f"Offset: {offset}, Fields: {fields}") offset += 4这段代码会输出每个本地文件头的字段值,包括版本、标志位、压缩方法、文件名长度、扩展字段长度等。如果某个字段的值异常,比如文件名长度远大于实际文件名长度,那就是隐写的信号。
最后再分享一个小技巧:用strings命令快速查看压缩包中的可读字符串。有时候隐藏信息是明文存储的,用strings就能直接看到:
strings suspicious.zip | grep -i flag这个命令会输出压缩包中所有可读字符串,并过滤包含flag的行。如果隐藏信息是明文,这个命令能秒出结果。当然,如果信息被加密或编码了,就需要进一步分析。
压缩包隐写分析的核心思路是:不要相信表面看到的东西。解压出来的文件可能是障眼法,压缩包本身的结构才是重点。多问自己几个“为什么”:为什么文件这么大?为什么解压需要密码?为什么不同工具解压结果不一样?把这些“为什么”搞清楚,隐藏信息自然就浮出水面了。