Cython生成的so动态链接库逆向研究
来个引子:TPCTF的maze题目
如何生成这个so文件
创建对应python库文件
def test_add(a,b):
a = int(a)
b = int(b)
return a + b
def test_calc(li):
for i in range(len(li)):
li[i] ^= 0x52
li[i] += 3
return li
创建对应的接口测试文件
import testso
li = [1,2,3,4]
res1 = testso.test_add(3,4)
res2 = testso.test_calc(li)
print(res1)
print(res2)
┌──(kali㉿ksli)-[~/Desktop/testso]
└─$ python main.py
7
[86, 83, 84, 89]
创建库扩展文件
from setuptools import setup
from Cython.Build import cythonize
setup(
name="testso",
ext_modules=cythonize('testso.py') # your file ready to compile`
)
生成so扩展库testso
pip install Cython
python setup.py build_ext –inplace
生成前
生成后
图中唯一的那个so文件,就是我们想要的扩展库
删掉之前写的testso.py
,原样执行main.py
,可以发现同样导入testso成功,正常输出
接下来是逆向
first
具体的实现就和上面的main.py
一样了
这时候有人就要问了,你怎么知道有什么类什么函数?
help
函数,他有着类似Java反射的能力,能够显示链接库中定义的类、函数、函数参数以及一些变量和常量等等
,实例如下:import testso
help(testso)
效果
至于怎么进行下一步测试,就不用说了吧
这是第一个可以逆向分析的点:获取库文件的基础信息,还可以进行一些测试,推敲函数功能等等
Second



__pyx_moduledef # init
__pyx_methods
__pyx_moduledef_slots
__pyx_pymod_create # 创建模块
__pyx_pymod_exec # 执行模块
(https://docs.python.org/zh-cn/3/c-api/module.html?highlight=pymoduledef_slot#)

———————————手动分割—————————–

help
直接知道对应的函数,然后ctrl f
来找对应函数,岂不就是最快的我们看看这些函数里面的内容是不是我们所编写的内容



需不需要回忆一下?
testso.c
文件OK
文章写到这里基本就结束了,如果你想要完整的分析整个调用逻辑,就需要从init–>exec一步步分析了,对于这种so-python来说,看代码还是比较头疼的,结合调库debug,效率会高很多。
我们做了些什么嘞?一起编写了一个so形式的python库,知道了如何对这个so
进行debug,以及逆向分析的一些入手点,希望你也有所收获
不过说到底,只要核心能力强,手撕万物都不是问题
协作:UKFC战队:
UmVfX1BvaW50
By7e_f@lc0n
参考文章:https://www.yasar.li/archives/tpctf2023-maze-wp
作者:UmVfX1BvaW50