网站首页 > 技术文章 正文
Cpython逆向
Python代码转换为C代码的时候,将会大大增加框架代码量。
1、正向py->c
先有正向,再有逆向
pip install cython
写一个简单的pyx文件
.pyx 文件是由 Cython 编程语言 "编写" 而成的 Python 扩展模块源代码文件
print("hello")
写一个 setup.py文件
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("test.pyx")
)
使用命令开始编译
python setup.py build_ext --inplace
生成如下文件
打开test.c发现有几千行代码
单纯的一行python代码,生成为c代码就几千行
调用so文件
2、逆向分析
2.1 字符串类型
_Pyx_CreateStringTabAndInitStrings
全局字符串赋值一般在_Pyx_CreateStringTabAndInitStrings中,该函数中使用的字符串定义数组形如:
typedef struct{
PyObject**p;
constchar*s;
constPy_ssize_t n;
constchar* encoding;
constchar is_unicode;
constchar is_str;
constchar intern;
} __Pyx_StringTabEntry;
而字符串是通过__Pyx_StringTabEntry的数组进行初始化的,也就是说当我们在该函数中看到以下伪代码时:
v8 = _mm_unpacklo_epi64(&qword_28A98, "AttributeError");
v9 = 15LL;
v10 = 0LL;
v11 = 0x100;
v12 = 1;
就代表这是一个{&qword_28A98, "AttributeError", 15, 0, 1, 0, 1}的__Pyx_StringTabEntry,也就是说qword_28A98中将要初始化一个内容是"AttributeError"的字符串对象的地址,在后续调用中,调用到AttributeError字符串的地方都会用&qword_28A98指代
2.2 整数类型
_pyx_pymod_exec_chal
qword_29170 = PyLong_FromLong(113LL, v9, v244, v245);
if ( qword_29170 )
qword_29170中将存储一个值为113的整数类型的Python对象。
qword_29600 = PyLong_FromString("2654435769", 0LL, 0LL);
if ( qword_29600 )
大数会用PyLong_FromString函数来初始化,这里qword_29600中将存储一个值为2654435769的整数类型的Python对象,后续用到2654435769的地方将使用qword_29600。
2.3 import写法
v539 = _Pyx_ImportDottedModule_constprop_0(random);
if ( PyDict_SetItem(_pyx_mstate_global_static, random, v539) < 0 )
{
导入``random``模块,同``import random
3、实战分析
这里提供一道自己出的题目,采用了RC4加密,流程很简单。
让我们开干
把提供的so文件拖进IDA中
而且这个函数 _Pyx_CreateStringTabAndInitStrings() 非常大,不能反编译
目前不知道这个函数的加密,我们先打印其相关的属性,看看能不能找到蛛丝马迹
import test
dir(test)
发现是RC4加密,这样逻辑就清晰了
所以现在的目标是获得RC4的秘钥和密文咯,假设RC4没有魔改
刚才我们在函数_Pyx_CreateStringTabAndInitStrings 找到了非常类似密文的值
9d7422eabf8baf369c09121f02e940099d9c6b538d88e30aac08
但是没有找到 秘钥,说明秘钥可能就不是字符串,而是byte类型!
我们先搜索RC4相关函数
发现代码非常多,暂时先不去分析RC4算法
看看哪里调用了我们的RC4算法
函数:_pyx_pymod_exec_test
{width=
但是byte类型怎么初始化呢?
我们编写一个demo,然后反编译去查看初始化方式即可
demo.pyx
key = b'mykekekeke'
en_flag = b'12312312312312'
demo_setup.pyx
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("demo.pyx")
)
运行命令
python demo_setup.py build_ext --inplace
先看看c文件
还是很清晰的,直接IDA分析so文件
发现byte类型也存储在函数_Pyx_CreateStringTabAndInitStrings
所以我们再翻阅一下,成功找到类似key的代码
DASCTF{cpython_is_so_easy}
4、参考
Cython 二进制库逆向分析全面指南
https://mp.weixin.qq.com/s/2mjjfuEwSDfMB5ssAQDwKQ
猜你喜欢
- 2025-07-09 用 Python 玩转内存管理——让代码更快更省更聪明
- 2025-07-09 20分钟拿下!Python pip 功能大全(python 2.7 pip)
- 2025-07-09 用python编写一个初中信息科技选择题练习系统
- 2025-07-09 【Python程序开发系列】Jupyter Notebook的使用方法(案例演示)
- 2025-07-09 我把 ML 模型编译成 C 后,速度竟提升了 1000 倍!
- 2025-07-09 全国计算机等级考试二级Python易错真题详解-流程控制-单选题
- 2025-07-09 使用python生成添加管理员账户的exe
- 2025-07-09 原来如此:Python居然有6种模块路径搜索方式
- 2025-07-09 PyBind11简明教程【Python/C++】(pybind11编译)
- 2025-07-09 Python 3.14 新特性盘点,更新了些什么?
- 277℃Python短文,Python中的嵌套条件语句(六)
- 276℃python笔记:for循环嵌套。end=""的作用,图形打印
- 273℃PythonNet:实现Python与.Net代码相互调用!
- 268℃Python实现字符串小写转大写并写入文件
- 267℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 126℃原来2025是完美的平方年,一起探索六种平方的算吧
- 110℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 107℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)