CPython逆向实战分析

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

Python代码转换为C代码的时候,将会大大增加框架代码量。
基础教程 | Cython 官方文档中文版(gitbooks.io)
1、正向py->c

先有正向,再有逆向
  1. pip install cython
复制代码
写一个简单的pyx文件
.pyx 文件是由 Cython 编程语言 "编写" 而成的 Python 扩展模块源代码文件
  1. print("hello")
复制代码
写一个 setup.py文件
  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3. setup(
  4.    ext_modules = cythonize("test.pyx")
  5. )
复制代码
使用下令开始编译
  1. python setup.py build_ext --inplace
复制代码
[img=720,138.14744801512288]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410251530565.png[/img]

生成如下文件
[img=720,441.2283044058745]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410251530566.png[/img]

打开test.c发现有几千行代码
[img=720,464.79638009049773]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410251530567.png[/img]

单纯的一行python代码,生成为c代码就几千行
调用so文件
[img=720,149.30526315789473]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410251530568.png[/img]

2、逆向分析

2.1 字符串类型

_Pyx_CreateStringTabAndInitStrings
全局字符串赋值一般在_Pyx_CreateStringTabAndInitStrings​中,该函数中使用的字符串界说数组形如:
  1. typedef struct {
  2.     PyObject **p;
  3.     const char *s;
  4.     const Py_ssize_t n;
  5.     const char* encoding;
  6.     const char is_unicode;
  7.     const char is_str;
  8.     const char intern;
  9. } __Pyx_StringTabEntry;
复制代码
而字符串是通过__Pyx_StringTabEntry​的数组举行初始化的,也就是说当我们在该函数中看到以下伪代码时:
  1. v8 = _mm_unpacklo_epi64(&qword_28A98, "AttributeError");
  2. v9 = 15LL;
  3. v10 = 0LL;
  4. v11 = 0x100;
  5. v12 = 1;
复制代码
就代表这是一个{&qword_28A98, "AttributeError", 15, 0, 1, 0, 1}​的__Pyx_StringTabEntry​,也就是说qword_28A98​中将要初始化一个内容是"AttributeError"​的字符串对象的地址,在后续调用中,调用到AttributeError字符串的地方都会用&qword_28A98​指代
 
【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习发展路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证测验指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂口试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
 
2.2 整数类型

_pyx_pymod_exec_chal​
  1. qword_29170 = PyLong_FromLong(113LL, v9, v244, v245);
  2. if ( qword_29170 )
复制代码
qword_29170​中将存储一个值为113​的整数类型的Python对象。
  1. qword_29600 = PyLong_FromString("2654435769", 0LL, 0LL);
  2. if ( qword_29600 )
复制代码
大数会用PyLong_FromString​函数来初始化,这里qword_29600​中将存储一个值为2654435769​的整数类型的Python对象,后续用到2654435769的地方将使用qword_29600​。
2.3 import写法

[code]v539 = _Pyx_ImportDottedModule_constprop_0(random);if ( PyDict_SetItem(_pyx_mstate_global_static, random, v539) ></strong></p>  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表