zip 常见攻击汇总
Yolo 这里会对遇到的 zip 攻击做个汇总,对原理会做一个简单的讲解
CRC32 爆破攻击
这有两个重要概念需要清楚(来自 Gemini 老师
CRC32 是什么?
- 全称:Cyclic Redundancy Check,循环冗余校验。
- 用途:它是一种数据完整性校验算法,而不是加密算法。它的主要目的是检查数据在传输或存储过程中是否发生了意外的损坏或改变。
- 原理:它会根据文件的二进制内容,通过一套固定的数学运算,生成一个 32 位的整数值(即 CRC32 校验码)。你可以把它想象成是文件的一个非常简单的“指纹”。如果文件的任何一个比特(bit)发生了改变,那么重新计算出的 CRC32 值有极大的概率会不同。
- 关键特性:计算速度非常快。
ZIP 压缩包的结构
- 一个 ZIP 包里可以包含多个文件。对于每个文件,ZIP 格式都会存储两部分信息:
- 文件数据(File Data):这是文件本身的内容,经过压缩和加密。
- 文件元数据(Metadata/Header):这是描述文件信息的数据,比如文件名、原始大小、压缩后的大小,以及最重要的——原始文件(未加密前)的 CRC32 校验码。
- 致命缺陷:在使用传统的 ZipCrypto 加密时,文件数据本身是被加密的,但包含 CRC32 值的这部分元数据却是以明文形式存储的,没有被加密。
回到这一部分讲解的 crc32 爆破攻击,它有局限性,这种攻击主要针对的是ZipCrypto
算法,然后文件的未压缩大小都应该足够小,最好是 6 字节以下
关注的是这一部分,用 bandzip 或其他 zip 解压工具也能看到,基本上都叫做原始大小

解密脚本原理
简单说说这个攻击方法的原理,由于压缩包里面的文件内容很小很小,那么完全可以通过爆破的方式,通过生成所有可能的 3 字节(看未压缩大小)文件,然后和压缩包里的 crc32 值进行匹配,要是成功了,就可以拿它当作已知明文进行明文攻击,获取 flag,到这一步就很轻松了
然后简单说下我的解密脚本逻辑,当未压缩大小在 4 字节之内的话,那就直接明文穷举爆破即可 。然后大小超过 4 字节时,需要使用专门的数学工具进行 crc 反转攻击,原理涉及密码学,zip 加密原理等等(太复杂,没学会,就直接引用 theonlypwner 大佬的工具,然后我再在他的工具基础上,拓展了自行搜集 crc,自行检测密码是否正确的小功能
理论上,单纯使用 crc 反转攻击几乎可以实现所有小字节的爆破攻击,但是我这里依然选择保留 4 字节以下的明文穷举爆破过程,因为那位大佬的工具内置的字符集里面不包含中文字符或别的特殊字符
限制较为严格,我手动尝试添加其他字符的思路是不现实的,综合考虑到如果反转的时候遍历 256 字节,会失去 crc 反转攻击的快速优势,有利有弊吧,最终脚本就这样好了
INFO
其实我在想,如果能优化里面的数学原理的话,就不用怕这个遍历 256 字节了,毕竟我看它的解密过程,完全利用数学特性进行反算,而不是遍历爆破猜测,问题是能力有限,更改字符集的话,就要大幅度的更改当前的解密原理和逻辑,对我来说不现实
解密脚本
脚本 1:
https://github.com/theonlypwner/crc32/blob/main/crc32.py
脚本 2:
1 | #!/usr/bin/env python3 |
例题一
攻防世界-crc
首先通过 bkcrack 可以直观的看到压缩包的结构以及压缩方式等等,通过特征,我们能判断使用 crc32 爆破攻击
1 | bkcrack -L ad71bf43131c4b3fa27066a3b408f843.zip |
因为是 6 字节,所以使用 crc 反转攻击效率更高,而且我的脚本会自行检测字节大小来选择爆破模式,直接用脚本+压缩包
即可
那个 convert.txt 是串二进制,解密出来是个二维码,扫描得到 flag
1 | flag{owid0-o91hf-9iahg} |
例题二
ISCTF2023-ezcrc
这道题老坑了呢,那些小字节里的内容都是中文,所以说常用的 crc 爆破工具根本做不了,反转也用不了,好在,原始字节就 3 个,直接遍历爆破即可(为了加速爆破,选择一次性批量爆破,这样做比一个一个文件单独爆破要快得多得多
1 | bkcrack -L ezcrc.zip |
1 | 这个就是压缩包所有小字节的内容: |
哈哈,读完我就笑了,这里的东西全是拼音表还有数字呢
基本上是参考这个表,写个替换反转脚本

1 | # -*- coding: UTF-8 -*- |
然后将结果进行两次 base64 解码,拿到 flag

说些什么吧!