妹妹 自慰 实战分析Cpython逆向
1、正向py->c妹妹 自慰
先有正向,再有逆向
pip install cython
写一个浅近的pyx文献
.pyx 文献是由 Cython 编程言语 "编写" 而成的 Python 膨胀模块源代码文献
print("hello")
写一个 setup.py文献
from distutils.core import setupfrom Cython.Build import cythonizesetup( 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)
导入``random``模块,同``import random
3、实战分析
这里提供一齐我方出的题目,汲取了RC4加密,经由很浅近。
让咱们开干
把提供的so文献拖进IDA中
并且这个函数 _Pyx_CreateStringTabAndInitStrings 尽头大,不成反编译
刻下不知谈这个函数的加密,咱们先打印其关系的属性,望望能不成找到蛛丝马迹
import testdir(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 setupfrom Cython.Build import cythonizesetup( ext_modules = cythonize("demo.pyx"))
运行号召
python demo_setup.py build_ext --inplace
先望望c文献
依然很了了的,径直IDA分析so文献
发现byte类型也存储在函数_Pyx_CreateStringTabAndInitStrings
是以咱们再翻阅一下,到手找到肖似key的代码
DASCTF{cpython_is_so_easy}
妹妹 自慰