伪加密
🏷️ 例题:
| 20251108浙江省赛 RealSignin(伪加密修复)
| 20251206Mini VN welcome.pdf(PDF伪加密)
| 20251201ISCTF 星髓宝盒(binwalk+foremost分离ZIP)
加密标志位被人为置 1,但数据实际没加密——改一个 bit 就能让解压软件”以为”有密码。
怎么判断
用 010 Editor 打开 ZIP:
- 搜
50 4B 03 04(本地文件头),看第 6~7 字节(General Purpose Bit Flag) - 如果是
09 00(第一位是 1),就是伪加密的嫌疑 - 同时搜
50 4B 01 02(中央目录头),同一位置也应该有一致的加密标志
真正的加密 ZIP,数据区是乱码;伪加密 ZIP,数据区能直接看到原始文件内容。
修复方法
改回 00 00 即可,两种改法:
- 只改本地文件头:
50 4B 03 04后面第 6-7 字节09 00→00 00 - 两个都改:中央目录
50 4B 01 02后面第 6-7 字节也改成00 00
有的题只改了一个位置,有的两个位置都改了,都检查一下比较稳。
直接用 010 搜 09 00 然后看上下文是不是在 ZIP 结构里,是的话改成 00 00 保存就行。
另一种伪加密
还有一种情况是 ZIP 密码是纯空格或者纯不可见字符,ARCHPR 之类的爆破工具可能直接跳过空格,所以如果你觉得”应该是伪加密但改了标志位还是不行”,试试密码输入一个空格。
压缩包结构
ZIP 文件从后往前解析:EOCD → 中央目录 → 本地文件头。
三大部分
1 | [本地文件头 + 文件数据] × N ← 每个文件一份 |
EOCD(End of Central Directory Record)
签名:50 4B 05 06
| 偏移 | 大小 | 含义 |
|---|---|---|
| 0 | 4 | 签名 50 4B 05 06 |
| 8 | 2 | 中央目录条目总数 |
| 12 | 4 | 中央目录大小(字节) |
| 16 | 4 | 中央目录起始偏移 |
EOCD 被删/被藏 → 解压报错。有些题会把 EOCD 挪走或藏在文件末尾注释里。
中央目录(Central Directory)
签名:50 4B 01 02
每个文件占一条:文件名、大小、CRC32、压缩方法、加密标志等。
本地文件头(Local File Header)
签名:50 4B 03 04
紧挨着文件数据。CRC32 可能为 0(用了 Data Descriptor 时)。
实战中常用的结构定位
1 | 50 4B 03 04 → 文件数据开始处 |
用 010 打开,搜 504B,看后面跟的是什么,就能大概判断 ZIP 的完整性了。
密码爆破
本质就是”试”——把可能的密码一个一个试过去。
常用工具
ARCHPR(Windows)
适合纯数字、纯字母的简单密码。
- 勾选”暴力破解”,选好字符集和长度范围
- 如果是已知部分密码的,用”掩码”模式
fcrackzip(Kali)
命令行工具,适合集成到脚本里。
1 | # 纯数字 4-6 位 |
参数说明:
-b:暴力破解-c:字符集(1=数字,a=小写,A=大写,!=特殊字符)-l:长度范围-u:用 unzip 验证(更准确但更慢)
John the Ripper
1 | # 先用 zip2john 提取 hash |
适合字典攻击,常见英文单词/弱密码比暴力快得多。
hashcat(GPU 加速)
如果你有 GPU,这个比上面所有都快。但要先提取 hash。Misc 题一般用不上 GPU,知道有这么个东西就行。
提速思路
- 先用弱密码字典(
rockyou.txt、top10000.txt)跑一遍 - 根据题面提示缩小范围(”生日”→纯数字4-8位,”简单密码”→弱密码字典)
- 纯数字优先(爆破最快),再试小写字母,再试混合
掩码攻击
你大概知道密码的格式,但不确定具体值。
比如猜测密码是 flag_????,设掩码 flag_???,保持 flag_ 不变只爆破后面几位。
ARCHPR 的”掩码”模式写 flag_%4 表示后面 4 个任意字符。给提示(如”password is 生日”)时知道格式就不用从头暴力。
CRC爆破
ZIP 中央目录里存了每个文件的 CRC32。文件极小(≤ 5 字节)时,直接枚举所有可能的文件内容算 CRC32 找匹配,不需要密码。
适用条件
- ZIP 里有一个体积极小的文件(≤ 5 字节最理想,6 字节就很慢了)
- 文件名和 CRC32 已知(中央目录不加密,明文可见)
- 最好知道内容的格式(比如
flag{?}或者纯数字),可以极大缩小搜索空间
工具和脚本
1 | import zipfile |
自己写的时候注意
- CRC32 用的是
zlib.crc32,不是binascii.crc32(两者实现一样,但习惯用 zlib) - 如果知道内容特征(比如前几个字符是
flag),可以用前缀剪枝 - 纯数字 4 位 → 10000 种,秒出;小写字母+数字 5 位 → 6000 万种,CPU 要跑一会儿
明文攻击
内容比较多,我单独开了一个文件 → 4.1已知明文攻击(bkcrack),那边有完整的原理、条件和各种文件类型的实战。