cython逆向之CTF实战(1)
字数 1401 2025-08-22 12:23:12

Cython逆向分析实战:CTF题目rand0m解析

前言

随着Cython在CTF题目中的应用越来越广泛,掌握Cython逆向分析技能变得尤为重要。本文将以CISCN比赛中的"rand0m"题目为例,详细讲解如何逆向分析Cython编译的.pyd文件。

环境准备

  1. Python版本匹配

    • Cython编译的.pyd文件对Python版本有严格要求
    • 建议使用conda环境管理不同Python版本
    • 本例中使用Python 3.12.5版本可正常运行
  2. 工具准备

    • IDA Pro(用于逆向分析)
    • Python环境(用于调试)

初步分析

  1. 文件构成

    • 题目提供一个.py文件和一个.pyd文件
    • .pyd文件相当于DLL,可被同目录下的.py文件直接导入
  2. 关键函数定位

    • 使用IDA打开.pyd文件
    • Shift+F12查看字符串界面,寻找"rand0m"相关字符串
    • 在.py脚本中发现调用了rand0m.check函数
    • 在IDA中对rand0m.check按x进行交叉引用
  3. 函数引用分析

    • 通常会出现两行引用:
      1. 第一行是函数的包装函数
      2. 第二行是函数的内部实现

调试方法

  1. 调试准备

    • 编写一个Python文件调用目标函数
    • 在函数开头使用input()以便IDA附加
  2. IDA附加调试

    • 运行Python脚本
    • 使用IDA附加到python.exe进程
    • 在关键函数处设置断点
    • 在命令行输入数据触发断点

关键数据结构

  1. PyList_New

    • 用于创建新的列表
    • 参数指定列表长度(本例中为8)
  2. 硬编码数据指针

    • 形如off_7FFE92BAB688[40]的指针存储Python硬编码数据
    • 可通过IDA交叉引用查看具体值
    • 例如off_7FFE92BAB688[40]存储值为304643896

算法逆向分析

1. 异或操作

tmp1 = input_value ^ 2654435769
  • 使用PyNumber_Xor函数实现
  • 第二个操作数为off_7FFE9DAEB688[44](2654435769)

2. 右移操作

tmp2 = tmp1 >> 5
  • 通过右移函数实现
  • 查看第二个或第三个参数确定位移量

3. 左移操作

tmp3 = tmp1 << 4
  • 使用左移函数实现
  • 位移量由off_7FFE9DAEB688[32]确定

4. 按位与操作

tmp4 = tmp3 & 4198170623
  • 使用按位与函数实现
  • 操作数为off_7FFE9DAEB688(4198170623)

5. 组合操作

tmp5 = tmp2 >> 23
tmp6 = tmp4 + tmp5

6. 幂和模运算

tmp7 = ((tmp1 >> 11) ** 65537) % 4294967293

完整算法还原

综合以上分析,可以还原出完整的处理算法:

  1. 输入值与硬编码常量异或
  2. 进行一系列位移和位运算
  3. 执行幂运算和模运算
  4. 返回处理结果

注意事项

  1. 静态分析取值

    • 注意查看静态分析中的off_7FFE9DAEB688[32]等指针
    • Cython在动态调试中,32位数值可能只有30位有效
  2. 数据类型转换

    • 在IDA中可使用d键将db转为dp查看数据结构
    • 注意参数a2是一个结构体,包含处理数据
  3. 函数识别

    • 重点关注IDA中粉色的函数(核心处理函数)
    • 其他辅助函数可暂时忽略

验证方法

  1. 通过返回值验证还原的算法是否正确
  2. 对比静态分析结果与动态调试结果
  3. 编写模拟算法验证处理逻辑

总结

通过本案例,我们掌握了:

  1. Cython逆向分析的基本流程
  2. IDA调试Cython编译的.pyd文件的方法
  3. 识别和还原Cython中的关键算法
  4. 处理硬编码数据和复杂运算的技巧

这些技能对于解决CTF中日益增多的Cython逆向题目至关重要。

Cython逆向分析实战:CTF题目rand0m解析 前言 随着Cython在CTF题目中的应用越来越广泛,掌握Cython逆向分析技能变得尤为重要。本文将以CISCN比赛中的"rand0m"题目为例,详细讲解如何逆向分析Cython编译的.pyd文件。 环境准备 Python版本匹配 : Cython编译的.pyd文件对Python版本有严格要求 建议使用conda环境管理不同Python版本 本例中使用Python 3.12.5版本可正常运行 工具准备 : IDA Pro(用于逆向分析) Python环境(用于调试) 初步分析 文件构成 : 题目提供一个.py文件和一个.pyd文件 .pyd文件相当于DLL,可被同目录下的.py文件直接导入 关键函数定位 : 使用IDA打开.pyd文件 Shift+F12查看字符串界面,寻找"rand0m"相关字符串 在.py脚本中发现调用了 rand0m.check 函数 在IDA中对 rand0m.check 按x进行交叉引用 函数引用分析 : 通常会出现两行引用: 第一行是函数的包装函数 第二行是函数的内部实现 调试方法 调试准备 : 编写一个Python文件调用目标函数 在函数开头使用 input() 以便IDA附加 IDA附加调试 : 运行Python脚本 使用IDA附加到python.exe进程 在关键函数处设置断点 在命令行输入数据触发断点 关键数据结构 PyList_ New : 用于创建新的列表 参数指定列表长度(本例中为8) 硬编码数据指针 : 形如 off_7FFE92BAB688[40] 的指针存储Python硬编码数据 可通过IDA交叉引用查看具体值 例如 off_7FFE92BAB688[40] 存储值为304643896 算法逆向分析 1. 异或操作 使用 PyNumber_Xor 函数实现 第二个操作数为 off_7FFE9DAEB688[44] (2654435769) 2. 右移操作 通过右移函数实现 查看第二个或第三个参数确定位移量 3. 左移操作 使用左移函数实现 位移量由 off_7FFE9DAEB688[32] 确定 4. 按位与操作 使用按位与函数实现 操作数为 off_7FFE9DAEB688 (4198170623) 5. 组合操作 6. 幂和模运算 完整算法还原 综合以上分析,可以还原出完整的处理算法: 输入值与硬编码常量异或 进行一系列位移和位运算 执行幂运算和模运算 返回处理结果 注意事项 静态分析取值 : 注意查看静态分析中的 off_7FFE9DAEB688[32] 等指针 Cython在动态调试中,32位数值可能只有30位有效 数据类型转换 : 在IDA中可使用d键将db转为dp查看数据结构 注意参数a2是一个结构体,包含处理数据 函数识别 : 重点关注IDA中粉色的函数(核心处理函数) 其他辅助函数可暂时忽略 验证方法 通过返回值验证还原的算法是否正确 对比静态分析结果与动态调试结果 编写模拟算法验证处理逻辑 总结 通过本案例,我们掌握了: Cython逆向分析的基本流程 IDA调试Cython编译的.pyd文件的方法 识别和还原Cython中的关键算法 处理硬编码数据和复杂运算的技巧 这些技能对于解决CTF中日益增多的Cython逆向题目至关重要。