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

来个引子:TPCTF的maze题目

如何生成这个so文件

  • 为了研究逆向,我们先搞个例子感受一下生成so的整个过程,方便后续分析
创建对应python库文件
  • testso.py
def test_add(a,b):a = int(a)b = int(b)return a + bdef test_calc(li):for i in range(len(li)):li[i] ^= 0x52li[i] += 3return 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 cythonizesetup(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.rhkb.cn/news/216808.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb笔记之MySQL数据库

#Author 流云 #Version 1.0 一、引言 1.1 现有的数据存储方式有哪些? Java程序存储数据(变量、对象、数组、集合),数据保存在内存中,属于瞬时状态存储。 文件(File)存储数据,保存…

【基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现】

基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现 前言数据获取与清洗数据集数据获取数据清洗 数据分析与可视化数据分析功能可视化功能 创新点结语 前言 随着游戏产业的蓬勃发展,了解游戏销售数据对于游戏从业者和游戏爱好者都至关重要。为了更好地分…

自动化补丁管理软件

什么是自动化补丁管理 自动补丁管理(或自动补丁)是指整个补丁管理过程的自动化,从扫描网络中的所有系统到检测缺失的补丁,在一组测试系统上测试补丁,将它们部署到所需的系统,并提供定期更新和补丁部署状态…

Duplicate keys detected: This may cause an update error.【Vue遍历渲染报错的解决】

今天在写项目时,写到一个嵌套评论的遍历时,控制台出现了一个报错信息,但是并不影响页面的渲染,然后一看这个错的原因是 key值重复,那么问题的解决方式就很简单了。(vue for循环读取key值时, key…

LLM Agent发展演进历史(观看metagpt视频笔记)

LLM相关的6篇重要的论文,其中4篇来自谷歌,2篇来自openai。技术路径演进大致是:SSL (Self-Supervised Learning) -> SFT (Supervised FineTune) IT (Instruction Tuning) -> RLHF。 word embedding的问题:新词如何处理&…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF,批处理模式使扫描过程快速高效,自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件,您无需在扫描仪和计算机之间来回移动…

JavaEE 09 锁策略

1.锁策略 1.1 乐观锁与悲观锁 其实前三个锁是同一种锁,只是站在不同的角度上去进行描述,此处的乐观与悲观其实是指在预测的角度上看会发生锁竞争的概率大小,概率大的则是悲观锁,概率小的则是乐观锁 乐观锁在加锁的时候就会做较少的事情,加锁的速度较快,但是消耗的cpu资源等也会…

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类 过拟合,欠拟合 针对模型的拟合,这里引入两个概念:过拟合,欠拟合。 过拟合:在机器学习任务中,我们通常将数据集分为两部分:训…

beebox靶场A3 low级别 xss通关教程(二)

六:xss get型 eval 通过观察我们可以发现url地址中存在一个date函数 那我们可以试一下把后面的date()函数去掉,直接写入一个alert(555) 发现直接弹出一个框,证明有xss漏洞 七:xss href 直接进入页面会看到是get方法&#xff0c…

【JVM从入门到实战】(五)类加载器

一、什么是类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。 类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 二、jdk8及之前的版本 类加载器分为三类: 启动类加载器-加载Ja…

Docker Compose入门:打造多容器应用的完美舞台

Docker Compose 是一个强大的工具,它允许开发者通过简单的 YAML 文件定义和管理多容器的应用。本文将深入讨论 Docker Compose 的基本概念、常用命令以及高级应用场景,并通过更为丰富和实际的示例代码,助您轻松掌握如何通过 Docker Compose 打…

VLAN协议与单臂路由

文章目录 VLAN协议与单臂路由一、VLAN的概念及优势1、分割广播域2、VLAN的优势3、VLAN数据帧 二、VLAN的种类1、静态VLAN2、动态VLAN3、VLAN划分方式 三、静态VLAN的配置1、VLAN的范围2、静态VLAN的配置2.1 配置静态VLAN的步骤2.2 vlan三种端口类型举例:配置静态VLA…

1688按关键字搜索工厂数据,商品详情页数据的采集

公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中,点击获取测试key和secret)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheStrin…

【稳定检索】2024年物理化学工程与应用力学国际会议(ICPCEAM 2024)

2024年物理化学工程与应用力学国际会议(ICPCEAM 2024) 2024 International Conference on Physical and Chemical Engineering and Applied Mechanics(ICPCEAM) 一、【会议简介】 2024年物理化学工程与应用力学国际会议(ICPCEAM 2024)将于2024年3月9日在中国上海盛大召开。本次…

SpringIOC之@EnableLoadTimeWeaving

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

论文阅读:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 链接:https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近,通过对比视觉语言预训练(CLIP)的零镜头学习和少镜头学习在2D视觉识别方面表现出了鼓舞人心的表现,即学习在开放词汇设置下将图像与相应的文本匹配。然而,…

jdk+zookeeper+kafka 搭建kafka集群

环境准备 环境资源包: jdk-8u341-linux-x64.tar.gz kafka_2.12-2.2.0.tgz zookeeper-3.4.14.tar.gz server-idip状态server110.206.120.10leaderserver210.206.120.2followerserver310.206.120.3follower 一、安装jdk 因为kafka需要Java环境,所以优先…

Linux AMH服务器管理面板本地安装与远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装…

股票放量成交后,大涨的概率有多少?

很多时候,经常有人会感觉,成交量突然放大5倍以上,后面的股价大概率会上涨,很多投顾班的老师也是给大家展示这样的感觉,那究竟有多大比例的上涨呢? 【文章仅是数据分析,不构成任何投资建议】 一…

【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路:(九)Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模…