news 2026/5/21 6:01:16

CTF Crypto实战:AES模式(ECB/CBC/CTR)的漏洞利用与交互式解题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF Crypto实战:AES模式(ECB/CBC/CTR)的漏洞利用与交互式解题

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模式就像用同一把钥匙反复开锁 - 相同的明文块永远加密成相同的密文块。这个特性导致两个主要问题:

  1. 不能隐藏数据模式:加密后的数据仍保留明文的统计特征
  2. 容易遭受重放攻击:攻击者可以复制替换密文块

在CTF中,ECB模式题目通常会给出以下线索:

  • 加密后的数据呈现明显的重复模式
  • 题目允许加密任意明文
  • 需要恢复flag但无法直接获取密钥

2.2 实战案例:ECB字节翻转攻击

去年某场比赛中有道经典题目:服务端用ECB模式加密"user=admin&flag="+flag,我们可以控制user参数但必须保持固定长度。解题思路如下:

  1. 先发送"user=aaaaaaaaaaadmin&flag=",记下第2块的密文(对应"aaaaaaaaaaadmin")
  2. 再发送"user=bbbbbbbbbbb&flag=",此时第1块是"user=bbbbbbbbbbb"
  3. 将第1块替换为已知的admin密文块,解密后服务端就会把我们的用户识别为admin
from 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安全得多,它引入了两个关键机制:

  1. 初始化向量(IV):随机化的初始值
  2. 块间依赖:前一个密文块会与当前明文块异或后再加密

加密过程可以表示为:

密文块1 = 加密(明文块1 ⊕ IV) 密文块2 = 加密(明文块2 ⊕ 密文块1) ...

3.2 IV可控导致的漏洞

当攻击者可以控制IV时,CBC模式就可能被攻破。来看这个实际案例:

题目提供了一个加密Oracle,允许我们加密固定前缀+可控数据,返回IV和密文。我们需要让解密后的数据包含"admin=true"。

攻击步骤:

  1. 让服务端加密"prefixadmin=true",获取密文C和IV
  2. 计算新IV' = IV ⊕ "prefix" ⊕ "user="
  3. 提交(C, IV'),服务端解密时:
    • 第一块:解密(C1) ⊕ IV' = "prefix" ⊕ IV ⊕ "prefix" ⊕ "user=" = "user="
    • 后续块正常解密,最终得到"user=admin=true"
def cbc_iv_attack(): prefix = b"prefix" desired = b"user=" # 获取原始加密结果 cipher, iv = encrypt(prefix + b"admin=true") # 构造恶意IV new_iv = xor(xor(iv[:5], prefix[:5]), desired[:5]) + iv[5:] # 提交攻击 r = decrypt(cipher, new_iv) print(r) # 包含"user=admin=true"

这种攻击在CTF中非常常见,关键是利用异或运算的可逆性和交换律,通过精心构造的IV来"修正"解密结果。

4. CTR模式的流加密特性

4.1 CTR模式工作原理

CTR模式将AES变成了流密码:

  1. 初始化一个计数器(CTR)
  2. 加密计数器值得到密钥流块
  3. 密钥流与明文异或得到密文
  4. 计数器递增,重复过程

因为加密过程实际上是对计数器加密,而不是直接加密数据,这使得CTR有很多独特性质。

4.2 密钥流重用攻击

如果相同的CTR值被重复使用,会导致密钥流重用,这是致命的。假设:

密文1 = 明文1 ⊕ 加密(CTR) 密文2 = 明文2 ⊕ 加密(CTR)

那么攻击者可以计算:

密文1 ⊕ 密文2 = 明文1 ⊕ 明文2

通过分析这个异或结果,往往能恢复出原始明文。

在某道CTF题目中,服务端允许我们用相同CTR加密多个消息,其中包括flag。解题步骤:

  1. 加密大量已知明文(如全A、全B等)
  2. 获取flag密文
  3. 计算 已知明文 ⊕ 对应密文 = 密钥流
  4. 用密钥流解密flag密文
def ctr_reuse_attack(): # 获取已知明文的密文 known_plain = b"A"*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两种模式:

  1. 用ECB模式加密flag的SHA256哈希作为密钥
  2. 用这个密钥以CBC模式加密flag本身
  3. 提供加密Oracle可以加密任意数据

5.2 解题思路

  1. 利用ECB特性,通过精心构造的输入获取密钥的密文块
  2. 因为ECB相同明文产生相同密文,可以暴力破解密钥哈希
  3. 得到密钥后解密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)

这类综合题目考察对加密模式的深入理解和灵活运用能力。在实际比赛中,往往需要反复尝试和调整攻击方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 11:34:07

告别Spoon客户端!手把手教你用这个Vue+SpringCloud的Kettle Web版开源工具

从桌面到云端:基于VueSpringCloud的Kettle Web化实践指南 对于长期使用Kettle Spoon客户端的ETL工程师而言,反复安装Java环境、处理客户端兼容性问题、在多台机器间同步配置已成为日常痛点。当团队需要协作开发或管理远程服务器上的数据集成任务时&…

作者头像 李华
网站建设 2026/5/18 11:31:10

FlashHead技术解析:突破语言模型推理效率瓶颈

1. FlashHead技术解析:突破语言模型推理效率瓶颈的创新方案在自然语言处理领域,语言模型的分类头(Classification Head)负责将隐藏状态转换为词汇表大小的概率分布,是模型推理过程中的关键组件。随着现代语言模型词汇量…

作者头像 李华
网站建设 2026/5/18 11:30:08

NAFNet:重新定义图像修复的效率边界与设计范式

NAFNet:重新定义图像修复的效率边界与设计范式 【免费下载链接】NAFNet The state-of-the-art image restoration model without nonlinear activation functions. 项目地址: https://gitcode.com/gh_mirrors/na/NAFNet 在深度学习驱动的图像修复领域&#x…

作者头像 李华
网站建设 2026/5/18 11:30:07

053课程表

课程表 题目链接:https://leetcode.cn/problems/course-schedule/?envTypestudy-plan-v2&envIdtop-100-liked 我的解答: 无分析:一开始想到用哈希表,但提交后发现有key重复的样例,行不通,然后就没什么…

作者头像 李华
网站建设 2026/5/18 11:27:08

Dify插件守护进程:企业级AI应用自定义工具托管与运维指南

1. 项目概述:一个为Dify AI应用引擎服务的插件守护进程如果你正在使用Dify来构建和部署自己的AI应用,并且已经尝试过官方市场里那些开箱即用的插件,那么你很可能遇到过这样的场景:你想实现一个非常具体的业务逻辑,比如…

作者头像 李华