1. AES加密模式基础入门第一次接触CTF密码学题目时AES加密的各种模式总让人眼花缭乱。作为目前最常用的对称加密算法AES在实际CTF比赛中出现的频率极高。今天我们就来聊聊ECB、CBC、CTR这三种最常见的加密模式以及它们在CTF题目中的典型漏洞利用方式。AES本质上是一种分组加密算法每次处理固定128位16字节的数据块。不同的加密模式决定了这些数据块如何被处理和连接。就像做菜时同样的食材可以用炒、蒸、炸等不同烹饪方式同样的AES算法在不同模式下也会呈现出完全不同的安全性特征。在CTF实战中我们最常遇到这三种模式ECB模式电子密码本最简单的加密模式每个数据块独立加密CBC模式密码块链接每个数据块加密前会与前一个密文块异或CTR模式计数器模式通过递增计数器生成密钥流与明文异或初学者最容易犯的错误是认为只要用了AES就绝对安全。实际上错误的使用方式会让AES变得脆弱不堪。比如ECB模式加密的图片仍然能看出轮廓这就是很多CTF题目的出题点。2. ECB模式的典型漏洞利用2.1 ECB模式的特点与风险ECB模式就像用同一把钥匙反复开锁 - 相同的明文块永远加密成相同的密文块。这个特性导致两个主要问题不能隐藏数据模式加密后的数据仍保留明文的统计特征容易遭受重放攻击攻击者可以复制替换密文块在CTF中ECB模式题目通常会给出以下线索加密后的数据呈现明显的重复模式题目允许加密任意明文需要恢复flag但无法直接获取密钥2.2 实战案例ECB字节翻转攻击去年某场比赛中有道经典题目服务端用ECB模式加密useradminflagflag我们可以控制user参数但必须保持固定长度。解题思路如下先发送useraaaaaaaaaaadminflag记下第2块的密文对应aaaaaaaaaaadmin再发送userbbbbbbbbbbbflag此时第1块是userbbbbbbbbbbb将第1块替换为已知的admin密文块解密后服务端就会把我们的用户识别为adminfrom pwn import * from Crypto.Cipher import AES def solve(): io remote(target, 12345) # 获取admin密文块 io.sendlineafter(input:, a*10 admin) cipher io.recvline() admin_block cipher[16:32] # 构造恶意密文 io.sendlineafter(input:, b*11) cipher io.recvline() evil_cipher cipher[:16] admin_block cipher[32:] # 发送并获取flag io.sendlineafter(input:, evil_cipher) print(io.recvline())这种攻击之所以有效正是因为ECB模式下每个数据块都是独立加密解密的。通过组合不同的密文块我们可以拼凑出有特殊含义的明文。3. CBC模式的精妙攻击手法3.1 CBC模式工作原理CBC模式比ECB安全得多它引入了两个关键机制初始化向量(IV)随机化的初始值块间依赖前一个密文块会与当前明文块异或后再加密加密过程可以表示为密文块1 加密(明文块1 ⊕ IV) 密文块2 加密(明文块2 ⊕ 密文块1) ...3.2 IV可控导致的漏洞当攻击者可以控制IV时CBC模式就可能被攻破。来看这个实际案例题目提供了一个加密Oracle允许我们加密固定前缀可控数据返回IV和密文。我们需要让解密后的数据包含admintrue。攻击步骤让服务端加密prefixadmintrue获取密文C和IV计算新IV IV ⊕ prefix ⊕ user提交(C, IV)服务端解密时第一块解密(C1) ⊕ IV prefix ⊕ IV ⊕ prefix ⊕ user user后续块正常解密最终得到useradmintruedef cbc_iv_attack(): prefix bprefix desired buser # 获取原始加密结果 cipher, iv encrypt(prefix badmintrue) # 构造恶意IV new_iv xor(xor(iv[:5], prefix[:5]), desired[:5]) iv[5:] # 提交攻击 r decrypt(cipher, new_iv) print(r) # 包含useradmintrue这种攻击在CTF中非常常见关键是利用异或运算的可逆性和交换律通过精心构造的IV来修正解密结果。4. CTR模式的流加密特性4.1 CTR模式工作原理CTR模式将AES变成了流密码初始化一个计数器(CTR)加密计数器值得到密钥流块密钥流与明文异或得到密文计数器递增重复过程因为加密过程实际上是对计数器加密而不是直接加密数据这使得CTR有很多独特性质。4.2 密钥流重用攻击如果相同的CTR值被重复使用会导致密钥流重用这是致命的。假设密文1 明文1 ⊕ 加密(CTR) 密文2 明文2 ⊕ 加密(CTR)那么攻击者可以计算密文1 ⊕ 密文2 明文1 ⊕ 明文2通过分析这个异或结果往往能恢复出原始明文。在某道CTF题目中服务端允许我们用相同CTR加密多个消息其中包括flag。解题步骤加密大量已知明文如全A、全B等获取flag密文计算 已知明文 ⊕ 对应密文 密钥流用密钥流解密flag密文def ctr_reuse_attack(): # 获取已知明文的密文 known_plain bA*64 known_cipher encrypt(known_plain) # 获取flag密文 flag_cipher get_flag() # 计算密钥流 keystream xor(known_plain, known_cipher) # 解密flag flag xor(flag_cipher, keystream) print(flag)5. 混合模式的综合题目解析5.1 题目分析去年一道高质量题目结合了CBC和ECB两种模式用ECB模式加密flag的SHA256哈希作为密钥用这个密钥以CBC模式加密flag本身提供加密Oracle可以加密任意数据5.2 解题思路利用ECB特性通过精心构造的输入获取密钥的密文块因为ECB相同明文产生相同密文可以暴力破解密钥哈希得到密钥后解密CBC部分的flag关键点在于利用ECB的确定性来缩小爆破空间再结合CBC的解密流程完整获取flag。def combined_attack(): # 爆破密钥哈希 for i in range(256): test_hash sha256(bytes([i])).digest() test_cipher ecb_encrypt(test_hash) if test_cipher[:16] target_ecb_block: key test_hash break # 解密CBC部分 iv cipher[:16] ciphertext cipher[16:] aes AES.new(key, AES.MODE_CBC, iv) flag aes.decrypt(ciphertext) print(flag)这类综合题目考察对加密模式的深入理解和灵活运用能力。在实际比赛中往往需要反复尝试和调整攻击方案。
CTF Crypto实战:AES模式(ECB/CBC/CTR)的漏洞利用与交互式解题
发布时间:2026/5/18 11:35:53
1. AES加密模式基础入门第一次接触CTF密码学题目时AES加密的各种模式总让人眼花缭乱。作为目前最常用的对称加密算法AES在实际CTF比赛中出现的频率极高。今天我们就来聊聊ECB、CBC、CTR这三种最常见的加密模式以及它们在CTF题目中的典型漏洞利用方式。AES本质上是一种分组加密算法每次处理固定128位16字节的数据块。不同的加密模式决定了这些数据块如何被处理和连接。就像做菜时同样的食材可以用炒、蒸、炸等不同烹饪方式同样的AES算法在不同模式下也会呈现出完全不同的安全性特征。在CTF实战中我们最常遇到这三种模式ECB模式电子密码本最简单的加密模式每个数据块独立加密CBC模式密码块链接每个数据块加密前会与前一个密文块异或CTR模式计数器模式通过递增计数器生成密钥流与明文异或初学者最容易犯的错误是认为只要用了AES就绝对安全。实际上错误的使用方式会让AES变得脆弱不堪。比如ECB模式加密的图片仍然能看出轮廓这就是很多CTF题目的出题点。2. ECB模式的典型漏洞利用2.1 ECB模式的特点与风险ECB模式就像用同一把钥匙反复开锁 - 相同的明文块永远加密成相同的密文块。这个特性导致两个主要问题不能隐藏数据模式加密后的数据仍保留明文的统计特征容易遭受重放攻击攻击者可以复制替换密文块在CTF中ECB模式题目通常会给出以下线索加密后的数据呈现明显的重复模式题目允许加密任意明文需要恢复flag但无法直接获取密钥2.2 实战案例ECB字节翻转攻击去年某场比赛中有道经典题目服务端用ECB模式加密useradminflagflag我们可以控制user参数但必须保持固定长度。解题思路如下先发送useraaaaaaaaaaadminflag记下第2块的密文对应aaaaaaaaaaadmin再发送userbbbbbbbbbbbflag此时第1块是userbbbbbbbbbbb将第1块替换为已知的admin密文块解密后服务端就会把我们的用户识别为adminfrom pwn import * from Crypto.Cipher import AES def solve(): io remote(target, 12345) # 获取admin密文块 io.sendlineafter(input:, a*10 admin) cipher io.recvline() admin_block cipher[16:32] # 构造恶意密文 io.sendlineafter(input:, b*11) cipher io.recvline() evil_cipher cipher[:16] admin_block cipher[32:] # 发送并获取flag io.sendlineafter(input:, evil_cipher) print(io.recvline())这种攻击之所以有效正是因为ECB模式下每个数据块都是独立加密解密的。通过组合不同的密文块我们可以拼凑出有特殊含义的明文。3. CBC模式的精妙攻击手法3.1 CBC模式工作原理CBC模式比ECB安全得多它引入了两个关键机制初始化向量(IV)随机化的初始值块间依赖前一个密文块会与当前明文块异或后再加密加密过程可以表示为密文块1 加密(明文块1 ⊕ IV) 密文块2 加密(明文块2 ⊕ 密文块1) ...3.2 IV可控导致的漏洞当攻击者可以控制IV时CBC模式就可能被攻破。来看这个实际案例题目提供了一个加密Oracle允许我们加密固定前缀可控数据返回IV和密文。我们需要让解密后的数据包含admintrue。攻击步骤让服务端加密prefixadmintrue获取密文C和IV计算新IV IV ⊕ prefix ⊕ user提交(C, IV)服务端解密时第一块解密(C1) ⊕ IV prefix ⊕ IV ⊕ prefix ⊕ user user后续块正常解密最终得到useradmintruedef cbc_iv_attack(): prefix bprefix desired buser # 获取原始加密结果 cipher, iv encrypt(prefix badmintrue) # 构造恶意IV new_iv xor(xor(iv[:5], prefix[:5]), desired[:5]) iv[5:] # 提交攻击 r decrypt(cipher, new_iv) print(r) # 包含useradmintrue这种攻击在CTF中非常常见关键是利用异或运算的可逆性和交换律通过精心构造的IV来修正解密结果。4. CTR模式的流加密特性4.1 CTR模式工作原理CTR模式将AES变成了流密码初始化一个计数器(CTR)加密计数器值得到密钥流块密钥流与明文异或得到密文计数器递增重复过程因为加密过程实际上是对计数器加密而不是直接加密数据这使得CTR有很多独特性质。4.2 密钥流重用攻击如果相同的CTR值被重复使用会导致密钥流重用这是致命的。假设密文1 明文1 ⊕ 加密(CTR) 密文2 明文2 ⊕ 加密(CTR)那么攻击者可以计算密文1 ⊕ 密文2 明文1 ⊕ 明文2通过分析这个异或结果往往能恢复出原始明文。在某道CTF题目中服务端允许我们用相同CTR加密多个消息其中包括flag。解题步骤加密大量已知明文如全A、全B等获取flag密文计算 已知明文 ⊕ 对应密文 密钥流用密钥流解密flag密文def ctr_reuse_attack(): # 获取已知明文的密文 known_plain bA*64 known_cipher encrypt(known_plain) # 获取flag密文 flag_cipher get_flag() # 计算密钥流 keystream xor(known_plain, known_cipher) # 解密flag flag xor(flag_cipher, keystream) print(flag)5. 混合模式的综合题目解析5.1 题目分析去年一道高质量题目结合了CBC和ECB两种模式用ECB模式加密flag的SHA256哈希作为密钥用这个密钥以CBC模式加密flag本身提供加密Oracle可以加密任意数据5.2 解题思路利用ECB特性通过精心构造的输入获取密钥的密文块因为ECB相同明文产生相同密文可以暴力破解密钥哈希得到密钥后解密CBC部分的flag关键点在于利用ECB的确定性来缩小爆破空间再结合CBC的解密流程完整获取flag。def combined_attack(): # 爆破密钥哈希 for i in range(256): test_hash sha256(bytes([i])).digest() test_cipher ecb_encrypt(test_hash) if test_cipher[:16] target_ecb_block: key test_hash break # 解密CBC部分 iv cipher[:16] ciphertext cipher[16:] aes AES.new(key, AES.MODE_CBC, iv) flag aes.decrypt(ciphertext) print(flag)这类综合题目考察对加密模式的深入理解和灵活运用能力。在实际比赛中往往需要反复尝试和调整攻击方案。