关于Cython生成的so动态链接库逆向

news2024/12/23 17:10:35

来个引子: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图(GOF定义) 将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求排队或者记录日志,以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会(HDC.Together)」上,华为正式官宣「鸿蒙Next」,这个更新的版本将移除所有的 AOSP 代码,彻底与 Android 切割,使其成为一个完全自主研发的操作系统&a…

【视觉SLAM十四讲学习笔记】第四讲——指数映射

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

LeetCode008之字符串转换整数 (相关话题:状态机)

题目描述 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符(假设还…

以太网协议与DNS

以太网协议 以太网协议DNS 以太网协议 以太网用于在计算机和其他网络设备之间传输数据,以太网既包含了数据链路层的内容,也包含了物理层的内容. 以太网数据报: 其中目的IP和源IP不是网络层的目的IP和源IP,而是mac地址.网络层的主要负责是整体的转发过程,数据链路层负责的是局…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库? 随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。主要的原因有如下: 磁盘存储。业务量剧增&…

bugku--Simple_SSTI_1---2

第一题 看到一句话,需要传入一个传参为flag 设置一个变量为 secret_key 构造paykoad /?flagsecret_key 但是发现什么都没有 SSTI模版注入嘛 这里使用的是flask模版 Flask提供了一个名为config的全局对象,可以用来设置和获取全局变量。 继续构造pa…

揭示 ETL 系统架构中的 OLAP、OLTP 和 HTAP

探索 ETL 系统设计需要了解 OLAP、OLTP 和不断发展的 HTAP。让我们试图剖析这些范式的复杂性。 1. OLAP(联机分析处理): OLAP 是商业智能的中流砥柱,通过 OLAP 立方体进行多维数据分析。这些立方体封装了预先聚合、预先计算的数据…

关键点检测之修改labelme标注的json中类别名

import json import os import shutil#source_dir表示数据扩增之后的文件夹路径,此时标注的是多分类的标签 #new_dir表示转化之后得到的二分类文件夹def to2class():#json存放路径source_dir r1#json保存路径new_dir r1for i in os.listdir(source_dir):if i.ends…

人工智能_机器学习065_SVM支持向量机KKT条件_深度理解KKT条件下的损失函数求解过程_公式详细推导_---人工智能工作笔记0105

之前我们已经说了KKT条件,其实就是用来解决 如何实现对,不等式条件下的,目标函数的求解问题,之前我们说的拉格朗日乘数法,是用来对 等式条件下的目标函数进行求解. KKT条件是这样做的,添加了一个阿尔法平方对吧,这个阿尔法平方肯定是大于0的,那么 可以结合下面的文章去看,也…

任意文件读取漏洞

使用方法php://filter/readconvert.base64-encode/resourcexxx 任意文件读取漏洞 php://filter/readconvert.base64-encode/resourceflag 在url后边接上 以base64的编码形式 读取flag里面的内容 php://filter/readconvert.base64encode/resourceflag 用kali来解码 创建一个文…

【LeetCode刷题笔记(2)】【Python】【字母异位词分组】【中等】

字母异位词分组 题目描述 给定一个字符串数组strs,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 输入:字符串数组strs 输出:结果列表 字母异位词:由重新排列源单词的所有字母得到的一个新单词。 要求&#x…

Weblogic-CVE-2023-21839

一、漏洞概述 RCE漏洞,该漏洞允许未经身份验证的远程,通过T3/IIOP协议网络访问并破坏WebLogic服务器,成功利用此漏洞可导致Oracle WebLogic服务器被接管,通过rmi/ldap远程协议进行远程命令执行,当 JDK 版本过低或本地存在小工具&…

html 中vue3 的setup里调用element plus的弹窗 提示

引入Elementplus之后&#xff0c;在setup&#xff08;&#xff09;方法外面导入ElMessageBox const {ElMessageBox} ElementPlus 源码 &#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Elemen…

[Halcon图像] 基于多层神经网络MLP分类器的思想提取颜色区域

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

【代码随想录算法训练营-第六天】【哈希表】242,349,202,1

242.有效的字母异位词 第一遍 思考 比较简单&#xff0c;用数组就能实现了 class Solution {public boolean isAnagram(String s, String t) {int[] checkListi new int[256];int[] checkListj new int[256];for (int i 0; i < s.length(); i) {char checkChar s.ch…

【C语言程序设计】数组程序设计

目录 前言 一、数组的定义和初始化 二、数组的基本操作 三、数组的高级应用 四、程序设计 4.1 程序设计第一题 4.2 程序设计第二题 4.3 程序设计第三题 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助…

Redis哨兵模式:什么是哨兵模式、哨兵模式的优缺点、哨兵模式的主观下线和客观下线、投票选举、Redis 哨兵模式搭建

文章目录 什么是哨兵模式哨兵模式的优缺点主观下线和客观下线投票选举哨兵模式场景应用Redis version 6.0.5 集群搭建下载文件环境安装解压编译配置文件启动关闭密码设置 什么是哨兵模式 哨兵模式是Redis的高可用解决方案之一&#xff0c;它旨在提供自动故障转移和故障检测的功…

洛谷P1722 矩阵Ⅱ——卡特兰数

传送门&#xff1a; P1722 矩阵 II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1722 用不需要除任何数的公式来求。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<cmath> #includ…