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 题目功能

  • 提供两个主要功能:

    1. 加密命令:接受输入命令,检查是否为白名单命令(ls, echo, date),然后加密
    2. 执行命令:解密输入数据,检查命令头是否为白名单命令,然后执行
  • 关键限制:只能执行白名单中的命令(ls, echo, date)

2.2 漏洞机会

  • 命令注入可能:执行命令时只检查命令头,不检查后续参数
  • 加密缺陷:自实现AES存在类型问题,可能导致密钥泄露

3. AES实现缺陷分析

3.1 关键缺陷点

  • 数据类型误用:使用int类型而非unsigned char存储待加密数据
    • 允许输入值超过255
    • 导致后续S-box访问越界

3.2 加密过程异常

  1. 轮密钥加(AddRoundKey)

    • 正常操作:输入与轮密钥逐字节异或
    • 无异常,因为异或操作不受数据类型限制
  2. 字节代换(SubBytes)

    • 异常点:使用输入值直接索引S-box
    • S-box大小仅256字节,输入>255时访问越界
    • 实际效果:越界访问返回0x00
  3. 后续轮次

    • 异常字节(>255)经SubBytes后变为0x00
    • 这些0x00值参与后续加密轮次

3.3 解密过程异常利用

  1. 逆字节代换(InvSubBytes)

    • 解密时遇到0x00字节
    • 查找0x00在S-box中的原始位置(0x52)
    • 将0x00替换为0x52
  2. 最终轮密钥加

    • 0x52与真实密钥异或
    • 结果:0x52 ^ original_key
  3. 密钥泄露

    • 通过观察解密结果可计算:original_key = decrypted_byte ^ 0x52

4. 漏洞利用步骤

4.1 密钥泄露利用

  1. 构造特殊输入

    • 输入格式:ls + 13个中文字符(值>255)
    • 示例:ls 啊啊啊啊啊啊啊啊啊啊啊啊啊
  2. 获取解密结果

    • 解密输出示例:ls \017[\034\203:Q\031z\a\035\252\370\373
    • 后13字节为:0x52 ^ original_key[3..15]
  3. 计算部分密钥

    • original_key[3..15] = decrypted_byte ^ 0x52

4.2 爆破剩余密钥

  1. 加密已知明文

    • 示例:加密ls得到密文33f7eca2f2d35e7ed18900b952b27bcf
  2. 爆破前3字节

    • 已知:密钥后13字节
    • 暴力尝试前3字节(256^3可能性)
    • 匹配加密结果确定完整密钥

4.3 命令注入实现

  1. 构造恶意命令

    • 示例:ls; cat flag.txt
  2. 使用完整密钥加密

    • 通过自实现AES加密恶意命令
  3. 提交执行

    • 将加密结果提交给服务端执行
    • 绕过白名单检查实现任意命令执行

5. 防御措施

5.1 代码实现层面

  1. 严格数据类型

    • 使用unsigned char处理字节数据
    • 添加输入范围检查(0-255)
  2. 边界检查

    • S-box访问前检查索引范围
    • 拒绝非常规输入

5.2 加密使用层面

  1. 认证加密

    • 使用AEAD模式(如AES-GCM)而非单纯ECB
    • 添加完整性校验
  2. 输入验证

    • 解密后完整验证命令格式
    • 严格参数检查

6. 总结

本案例展示了加密算法实现中数据类型选择的重要性,以及边界条件检查的必要性。通过分析自实现AES的缺陷,我们了解到:

  1. 加密实现必须严格遵循规范,包括数据类型和边界条件
  2. ECB模式本身缺乏完整性保护,容易受到篡改
  3. 安全是一个整体,加密算法实现、输入验证、命令执行等环节都需要严格设计

这种类型的漏洞同时涉及密码学(Crypto)、逆向工程(RE)和二进制利用(Pwn)多个领域,是典型的多维度安全问题。

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)多个领域,是典型的多维度安全问题。