[ misc 知识点 ] 压缩包分析
2026-08-22 20:05:38

伪加密

🏷️ 例题:
| 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 即可,两种改法:

  1. 只改本地文件头50 4B 03 04 后面第 6-7 字节 09 0000 00
  2. 两个都改:中央目录 50 4B 01 02 后面第 6-7 字节也改成 00 00

有的题只改了一个位置,有的两个位置都改了,都检查一下比较稳。

直接用 010 搜 09 00 然后看上下文是不是在 ZIP 结构里,是的话改成 00 00 保存就行。

另一种伪加密

还有一种情况是 ZIP 密码是纯空格或者纯不可见字符,ARCHPR 之类的爆破工具可能直接跳过空格,所以如果你觉得”应该是伪加密但改了标志位还是不行”,试试密码输入一个空格。

压缩包结构

ZIP 文件从后往前解析:EOCD → 中央目录 → 本地文件头。

三大部分

1
2
3
[本地文件头 + 文件数据] × N  ← 每个文件一份
[中央目录条目] × N ← 每个文件一份,存元信息
[EOCD 结束记录] ← 定位中央目录的入口

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
2
3
4
50 4B 03 04 → 文件数据开始处
50 4B 01 02 → 中央目录开始处
50 4B 05 06 → EOCD(整个 ZIP 的入口)
50 4B 07 08 → 如果存在,是 ZIP64 的 EOCD

用 010 打开,搜 504B,看后面跟的是什么,就能大概判断 ZIP 的完整性了。

密码爆破

本质就是”试”——把可能的密码一个一个试过去。

常用工具

ARCHPR(Windows)

适合纯数字、纯字母的简单密码。

  • 勾选”暴力破解”,选好字符集和长度范围
  • 如果是已知部分密码的,用”掩码”模式

fcrackzip(Kali)

命令行工具,适合集成到脚本里。

1
2
3
4
5
# 纯数字 4-6 位
fcrackzip -b -c 1 -l 4-6 -u flag.zip

# 小写字母
fcrackzip -b -c a -l 3-8 -u flag.zip

参数说明:

  • -b:暴力破解
  • -c:字符集(1=数字,a=小写,A=大写,!=特殊字符)
  • -l:长度范围
  • -u:用 unzip 验证(更准确但更慢)

John the Ripper

1
2
3
4
5
# 先用 zip2john 提取 hash
zip2john flag.zip > hash.txt

# 再爆破
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

适合字典攻击,常见英文单词/弱密码比暴力快得多。

hashcat(GPU 加速)

如果你有 GPU,这个比上面所有都快。但要先提取 hash。Misc 题一般用不上 GPU,知道有这么个东西就行。

提速思路

  • 先用弱密码字典(rockyou.txttop10000.txt)跑一遍
  • 根据题面提示缩小范围(”生日”→纯数字4-8位,”简单密码”→弱密码字典)
  • 纯数字优先(爆破最快),再试小写字母,再试混合

掩码攻击

你大概知道密码的格式,但不确定具体值。

比如猜测密码是 flag_????,设掩码 flag_???,保持 flag_ 不变只爆破后面几位。

ARCHPR 的”掩码”模式写 flag_%4 表示后面 4 个任意字符。给提示(如”password is 生日”)时知道格式就不用从头暴力。

CRC爆破

ZIP 中央目录里存了每个文件的 CRC32。文件极小(≤ 5 字节)时,直接枚举所有可能的文件内容算 CRC32 找匹配,不需要密码

适用条件

  • ZIP 里有一个体积极小的文件(≤ 5 字节最理想,6 字节就很慢了)
  • 文件名和 CRC32 已知(中央目录不加密,明文可见)
  • 最好知道内容的格式(比如 flag{?} 或者纯数字),可以极大缩小搜索空间

工具和脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import zipfile
import zlib
import itertools
import string

# 读取 ZIP 拿到目标文件的 CRC32
with zipfile.ZipFile("flag.zip") as zf:
info = zf.getinfo("flag.txt")
target_crc = info.CRC
size = info.file_size

print(f"目标 CRC32: {target_crc:08X}, 文件大小: {size} 字节")

# 枚举所有可能的内容
charset = string.ascii_lowercase + string.digits + "{}_"
for combo in itertools.product(charset, repeat=size):
candidate = ''.join(combo).encode()
if zlib.crc32(candidate) == target_crc:
print(f"找到: {candidate.decode()}")
break

自己写的时候注意

  • CRC32 用的是 zlib.crc32,不是 binascii.crc32(两者实现一样,但习惯用 zlib)
  • 如果知道内容特征(比如前几个字符是 flag),可以用前缀剪枝
  • 纯数字 4 位 → 10000 种,秒出;小写字母+数字 5 位 → 6000 万种,CPU 要跑一会儿

明文攻击

内容比较多,我单独开了一个文件 → 4.1已知明文攻击(bkcrack),那边有完整的原理、条件和各种文件类型的实战。

| 例题-压缩包分析
| 例题-压缩包分析
| 例题-压缩包分析

上一页
2026-08-22 20:05:38
下一页