GoogleCTF2024 - encrypted runner:一种C语言自实现AES-ECB算法的缺陷以及利用分析
字数 1657 2025-09-01 11:26:17
AES-ECB自实现缺陷分析与利用教学文档
1. 问题概述
本案例分析Google CTF 2024中"encrypted runner"题目,该题目展示了一个自实现AES-ECB算法的缺陷,导致密钥泄露和命令注入漏洞。核心问题源于C语言实现中数据类型误用,使得攻击者能够通过精心构造的输入泄露加密密钥。
2. 题目环境分析
2.1 题目功能
-
提供两个主要功能:
- 加密命令:接受输入命令,检查是否为白名单命令(ls, echo, date),然后加密
- 执行命令:解密输入数据,检查命令头是否为白名单命令,然后执行
-
关键限制:只能执行白名单中的命令(ls, echo, date)
2.2 漏洞机会
- 命令注入可能:执行命令时只检查命令头,不检查后续参数
- 加密缺陷:自实现AES存在类型问题,可能导致密钥泄露
3. AES实现缺陷分析
3.1 关键缺陷点
- 数据类型误用:使用
int类型而非unsigned char存储待加密数据- 允许输入值超过255
- 导致后续S-box访问越界
3.2 加密过程异常
-
轮密钥加(AddRoundKey):
- 正常操作:输入与轮密钥逐字节异或
- 无异常,因为异或操作不受数据类型限制
-
字节代换(SubBytes):
- 异常点:使用输入值直接索引S-box
- S-box大小仅256字节,输入>255时访问越界
- 实际效果:越界访问返回0x00
-
后续轮次:
- 异常字节(>255)经SubBytes后变为0x00
- 这些0x00值参与后续加密轮次
3.3 解密过程异常利用
-
逆字节代换(InvSubBytes):
- 解密时遇到0x00字节
- 查找0x00在S-box中的原始位置(0x52)
- 将0x00替换为0x52
-
最终轮密钥加:
- 0x52与真实密钥异或
- 结果:
0x52 ^ original_key
-
密钥泄露:
- 通过观察解密结果可计算:
original_key = decrypted_byte ^ 0x52
- 通过观察解密结果可计算:
4. 漏洞利用步骤
4.1 密钥泄露利用
-
构造特殊输入:
- 输入格式:
ls + 13个中文字符(值>255) - 示例:
ls 啊啊啊啊啊啊啊啊啊啊啊啊啊
- 输入格式:
-
获取解密结果:
- 解密输出示例:
ls \017[\034\203:Q\031z\a\035\252\370\373 - 后13字节为:
0x52 ^ original_key[3..15]
- 解密输出示例:
-
计算部分密钥:
original_key[3..15] = decrypted_byte ^ 0x52
4.2 爆破剩余密钥
-
加密已知明文:
- 示例:加密
ls得到密文33f7eca2f2d35e7ed18900b952b27bcf
- 示例:加密
-
爆破前3字节:
- 已知:密钥后13字节
- 暴力尝试前3字节(256^3可能性)
- 匹配加密结果确定完整密钥
4.3 命令注入实现
-
构造恶意命令:
- 示例:
ls; cat flag.txt
- 示例:
-
使用完整密钥加密:
- 通过自实现AES加密恶意命令
-
提交执行:
- 将加密结果提交给服务端执行
- 绕过白名单检查实现任意命令执行
5. 防御措施
5.1 代码实现层面
-
严格数据类型:
- 使用
unsigned char处理字节数据 - 添加输入范围检查(0-255)
- 使用
-
边界检查:
- S-box访问前检查索引范围
- 拒绝非常规输入
5.2 加密使用层面
-
认证加密:
- 使用AEAD模式(如AES-GCM)而非单纯ECB
- 添加完整性校验
-
输入验证:
- 解密后完整验证命令格式
- 严格参数检查
6. 总结
本案例展示了加密算法实现中数据类型选择的重要性,以及边界条件检查的必要性。通过分析自实现AES的缺陷,我们了解到:
- 加密实现必须严格遵循规范,包括数据类型和边界条件
- ECB模式本身缺乏完整性保护,容易受到篡改
- 安全是一个整体,加密算法实现、输入验证、命令执行等环节都需要严格设计
这种类型的漏洞同时涉及密码学(Crypto)、逆向工程(RE)和二进制利用(Pwn)多个领域,是典型的多维度安全问题。