原题
题目简述:服务器实现了一个"自制"加密方案:
C[0] = AES_ECB(IV) ⊕ IV
C[1] = AES_ECB(P0) ⊕ P0
…
C[n] = AES_ECB(P[n-1]) ⊕ P[n-1]
C[n+1] = AES_ECB(P[n]) ← 最后一块不 XOR!
IV明文返回,加密 Oracle可用。给定一个密文,要求恢复明文(含 flag)。
分析过程
步骤 1:理解加密结构

数学表达:
C₀ = AES_ECB(IV) ⊕ P₀
C₁ = AES_ECB(P₀) ⊕ P₁
C₂ = AES_ECB(P₁) ⊕ P₂
…
Cₙ = AES_ECB(Pₙ₋₁) ⊕ Pₙ
Cₙ₊₁ = AES_ECB(Pₙ) ← 🔴 最后一块无 XOR!纯 ECB 输出!
步骤 2:漏洞分析
最后一块Cₙ₊₁=AES_ECB(Pₙ)没有任何XOR掩码。向服务器发送任意16字节X,服务器会返回AES_ECB(X)作为输出的最后一块。这实际上泄露了一个ECB加密预言机(Oracle)。
正常 AES-ECB: 你不知道 key,所以无法加密
这个方案: 你发什么,Oracle 就帮你用 key 加密什么
攻击者消息 X ──→ Oracle ──→ … ‖ AES_ECB(X) (最后16字节)
步骤 3:选择明文逐块攻击
第 1 轮: 发送 IV → 收到 AES_ECB(IV)
→ P₀ = C₀ ⊕ AES_ECB(IV)
第 2 轮: 发送 P₀ → 收到 AES_ECB(P₀)
→ P₁ = C₁ ⊕ AES_ECB(P₀)
第 k 轮: 发送 Pₖ₋₁ → 收到 AES_ECB(Pₖ₋₁)
→ Pₖ = Cₖ ⊕ AES_ECB(Pₖ₋₁)
终止条件: 所有块恢复完毕
链式攻击示意:
密文: [IV]──[C₀]──[C₁]──[C₂]──…
│ ⊕ ⊕ ⊕
│ │ │ │
Oracle: │ E(IV) E(P₀) E(P₁)
│ │ │ │
▼ ▼ ▼ ▼
明文: [IV] [P₀] [P₁] [P₂] …
完整解题脚本
from pwn import remote
from Crypto.Util.strxor import strxor
import binascii
# 连接服务器
p = remote('blocked2.wolvctf.io', 1337)
# === 读取加密邮件 ===
p.recvuntil(b'message:\\n')
ct = p.recvline().decode('ascii').strip()
# ct 结构: IV(16B=32hex) ‖ C₀(32hex) ‖ C₁(32hex) ‖ … ‖ Cₙ(32hex)
# === 逐块恢复 ===
current_plain = ct[:32] # 第一轮发送 IV
for i in range(len(ct) // 32 – 1):
p.sendlineafter(b'> ', current_plain)
ct1 = p.recvline().decode('ascii').strip()
# 恢复下一块明文
current_plain = strxor(
binascii.unhexlify(ct[32 * (i + 1):32 * (i + 2)]),
binascii.unhexlify(ct1[-32:]) # 取最后一块 = AES_ECB(当前块)
)
print(current_plain.decode('ascii'), end='', flush=True)
current_plain = binascii.hexlify(current_plain).decode()
解密后的邮件内容
those wolvsec nerds really think they're "good at security" huh…
running the ransomware was way too easy.
i've uploaded their files to our secure storage, let me know when you have them
-doubledelete@wolp.hv
Flag
wctf{s0m3_g00d_s3cur1ty_y0u_h4v3_r0lling_y0ur_0wn_crypt0_huh}
教训: 不要自己发明加密模式。一个未参与 XOR 的块就摧毁了整个加密方案。



