关于Cython生成的so动态链接库逆向
2023-12-13 20:31:19
来个引子:TPCTF的maze题目
如何生成这个so文件
- 为了研究逆向,我们先搞个例子感受一下生成so的整个过程,方便后续分析
创建对应python库文件
- testso.py
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
创建对应的接口测试文件
- main.py
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]
创建库扩展文件
- setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(
name="testso",
ext_modules=cythonize('testso.py') # your file ready to compile`
)
生成so扩展库testso
- 安装对应扩展cypthon
pip install Cython
- 执行生成命令
python setup.py build_ext --inplace
-
生成前
-
生成后
-
图中唯一的那个so文件,就是我们想要的扩展库
-
删掉之前写的
testso.py
,原样执行main.py
,可以发现同样导入testso成功,正常输出
接下来是逆向
- 对于逆向来说,我们所拥有的只有一个so的动态链接库,so是什么?elf文件,所以IDA看是少不了咯~
- 但是呢,我们可以讲究一些策略
first
- 首先要明白它是一个库文件。库能干什么,被调呗
- 所以相当于我们拥有了一项能力:对so文件进行黑盒调试的能力
具体的实现就和上面的main.py
一样了
- 导入库,创建类对象,调用函数。通过输入输出猜测函数功能
这时候有人就要问了,你怎么知道有什么类什么函数?
- 这就要说到python的
help
函数,他有着类似Java反射的能力,能够显示链接库中定义的类、函数、函数参数以及一些变量和常量等等
,实例如下: - 修改main.py
import testso
help(testso)
-
效果
-
至于怎么进行下一步测试,就不用说了吧
这是第一个可以逆向分析的点:获取库文件的基础信息,还可以进行一些测试,推敲函数功能等等
Second
- 想知道函数名称什么的当然不会只有一种方法,毕竟它还是个so,所以IDA还是要上的,只不过笔者目前也没有找到什么快捷的方法去审计这种代码,就会干瞪眼硬看
- 所以打开我们刚刚生成的so文件看看,来总结一些特征规律
- 打开导出表,可以看到有一个init+我们的链接库名的函数,跟踪看看
- 很好,init很好,跟踪变量,看看有什么
- 图里这些变量,有点意思哦,直接上结论
__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#) - 而紧跟在他们下面的
- 这不是我们定义的函数吗,来活了,知道要分析哪里了吧?
---------------------------------手动分割-----------------------------
- 其实你仔细观察所有的函数就可以发现一切有迹可循,看看下面这个函数名是否熟悉?
- 那么我们通过first中的
help
直接知道对应的函数,然后ctrl f
来找对应函数,岂不就是最快的
我们看看这些函数里面的内容是不是我们所编写的内容
需不需要回忆一下?
- 0x52,+3,虽然抽象,但确实就是,毕竟python要转C嘛,生成so的时候大家也应该看到了那个我没有提到的
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
文章来源:https://blog.csdn.net/qq_59700927/article/details/134978170
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!