CPython逆向实战分析

news/2025/3/19 17:56:43/文章来源:https://www.cnblogs.com/hetianlab/p/18502867

Python代码转换为C代码的时候,将会大大增加框架代码量。

基础教程 | Cython 官方文档中文版(gitbooks.io)

1、正向py->c

先有正向,再有逆向

pip install cython

写一个简单的pyx文件

.pyx 文件是由 Cython 编程语言 "编写" 而成的 Python 扩展模块源代码文件

print("hello")

写一个 setup.py文件

from distutils.core import setup
from Cython.Build import cythonize
​
setup(   ext_modules = cythonize("test.pyx")
)

使用命令开始编译

python setup.py build_ext --inplace

image

生成如下文件

image

打开test.c发现有几千行代码

image

单纯的一行python代码,生成为c代码就几千行

调用so文件

image

2、逆向分析

2.1 字符串类型

_Pyx_CreateStringTabAndInitStrings

全局字符串赋值一般在_Pyx_CreateStringTabAndInitStrings​中,该函数中使用的字符串定义数组形如:

typedef struct {
    PyObject **p;
    const char *s;
    const Py_ssize_t n;
    const char* encoding;
    const char is_unicode;
    const char is_str;
    const char 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​指代

 

【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

 

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) < 0 )
{

导入``random``模块,同``import random

3、实战分析

这里提供一道自己出的题目,采用了RC4加密,流程很简单。

让我们开干

image

把提供的so文件拖进IDA中

image

而且这个函数 _Pyx_CreateStringTabAndInitStrings() 非常大,不能反编译

目前不知道这个函数的加密,我们先打印其相关的属性,看看能不能找到蛛丝马迹

import test
dir(test)

image

发现是RC4加密,这样逻辑就清晰了

所以现在的目标是获得RC4的秘钥和密文咯,假设RC4没有魔改

刚才我们在函数_Pyx_CreateStringTabAndInitStrings 找到了非常类似密文的值

9d7422eabf8baf369c09121f02e940099d9c6b538d88e30aac08

但是没有找到 秘钥,说明秘钥可能就不是字符串,而是byte类型!

我们先搜索RC4相关函数

image

image

发现代码非常多,暂时先不去分析RC4算法

看看哪里调用了我们的RC4算法

image

函数:_pyx_pymod_exec_test

image

但是byte类型怎么初始化呢?

我们编写一个demo,然后反编译去查看初始化方式即可

demo.pyx

key = b'mykekekeke'
en_flag = b'12312312312312'

demo_setup.pyx

from distutils.core import setup
from Cython.Build import cythonize
​
setup(   ext_modules = cythonize("demo.pyx")
)

运行命令

python demo_setup.py build_ext --inplace

先看看c文件

image

还是很清晰的,直接IDA分析so文件

image

发现byte类型也存储在函数_Pyx_CreateStringTabAndInitStrings

所以我们再翻阅一下,成功找到类似key的代码

image

DASCTF{cpython_is_so_easy}

image

更多网安技能的在线实操练习,请点击这里>>

  

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

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

相关文章

场景题:百万数据插入Redis有哪些实现方案?

在面试的过程当中,偶尔会遇到一些场景题,虽然这些场景题归根到底还是技术问题,但他通常比常规的八股题要稍微难一些,因为他考验的是你对于技术的整体理解、应用,以及变通的能力。 那么今天咱们就来看一道,在面试中国平安时遇到的一道场景题:将百万数据插入到 Redis,有哪…

PbootCMS 404 错误解决方法

对于 PbootCMS 系统,404 错误出现的原因确实通常有以下两种情况:当前栏目调用的页面模板不正确,导致链接不存在:解决方法:进入后台管理,导航至“栏目管理”。 检查各栏目的模板设置,确保每个栏目都正确关联了对应的模板文件。 如果发现有栏目调用了不存在的模板文件,可…

BOS同步后进入应用提示“F_VTR_FORBIDDERID”,“F_VTR_FORBIDDATE无效”

原因: 同步反写规则业务对象未成功创建字段 解决:执行以下脚本 ALTER TABLE T_BF_WRITEBACKRULECUST ADD [F_VTR_FORBIDDERID] [INT] NOT NULL DEFAULT 0ALTER TABLE T_BF_WRITEBACKRULECUST ADD [F_VTR_FORBIDDATE] [DATETIME] NULL

如何在C语言中进行数据加密

## 如何在C语言中进行数据加密 在讨论C语言中的数据加密时,我们首先需要明确两个核心观点:使用加密库、实现自定义加密算法。其中,使用加密库是最直接且高效的方式,因为这允许开发者利用已经广泛测试和验证的加密算法来保护数据的安全性,而无需深入了解加密算法的内部工作…

使用Lucene.net来进行索引和检索

1.去 http://lucenenet.apache.org/ 下载lunece.net 文件 2.在项目添加引用Lucene.Net.dll class Program{static void Main(string[] args){//索引Directory direcotry = FSDirectory.GetDirectory("LuceneIndex");Analyzer analyzer = new StandardAnalyzer();I…

CSS Grid与Flexbox有何不同

CSS Grid与Flexbox的不同点:1. 定位方式不同;2. 维度不同;3. 主轴与交叉轴不同;4. 对齐方式不同;5. 元素排序不同;6. 应用场景不同;7. 自适应性不同等。Flexbox(弹性盒子模型)主要用于一维布局,即在行或列的方向上布局,Grid(网格布局)适用于二维布局,可以同时定义…

Gradle 7.0都有哪些新特性

Gradle 7.0引入了许多新特性和改进,主要包括:1、支持Java 16;2、性能改进;3、依赖管理改进;4、类型安全的项目访问器;5、移除已废弃的特性和API。特别的,依赖管理改进是本次更新的一个重点,通过减少模糊性,使得构建更加可预测和可维护。Gradle 7.0正式支持Java 16作为…

2024-10-25_Fri_15:06 - 中层管理:1以身作则

2024-10-25_Fri_15:06 - 中层管理:1以身作则 2024-10-25_Fri_13:20 - 以身作则是传递价值观的唯一方法! 2024-10-12_Sat_21:22 - 父母真正教育孩子的是途径 - 言传身教-以身作则 ‍ 2024-10-25_Fri_15:06 - 中层管理:1以身作则 2024-10-25_Fri_14:55 - 中层管理:2提升领导技…

Linux系统上nacos崩溃故障分析

前言:本月 21 日,公司的一个海外项目业测环境中的 Nacos 遭遇重大问题,竟意外 “宕机” 了。遗憾的是,这个项目并未配置监控系统,还是由负责的日本运维人员在上班时间发现并予以通告。而近日,我一直忙于搭建某项目的云监控平台,实在分身乏术。领导遂安排一位同事前去处理…

win11 使用hyper-v创建虚拟机

参考链接:在 Windows 上配置网卡多个 VLAN、多个虚拟网卡、实现单线多拨网速叠加(无需驱动支持) | Kenvixs Blog Set-VMNetworkAdapterVlan (Hyper-V) | Microsoft Learn 官网说明文档 【Windows使用】之--Hyper-V网络配置和虚拟交换机的使用-v林羽 常用虚拟机工具: virtua…

HTML5和Flash在网页设计上有什么不同_1

HTML5和Flash在网页设计上的主要区别包括:1.技术结构;2.兼容性和可访问性;3.性能和安全性;4.开发和维护成本;5.多媒体支持;6.搜索引擎优化;7.未来发展趋势。其中技术结构是两者最大的差异,HTML5基于标准的网页技术构建,而Flash依赖特定的插件。1.技术结构 HTML5是开放…

什么是随机梯度下降

随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,用于寻找函数的局部最小值。与传统的梯度下降方法不同,SGD在每一步中仅使用单个训练样本来计算梯度。它有助于减小计算成本,并可能逃离局部优异解。主要应用领域包括机器学习中的线性回归、逻辑回归和神经网…