怎么最近这么多Cython的题,做起来好痛苦。而且这种题还是那种很好出,但是不好逆的。当然,也就是暂时了。但凡有佬研究清楚结构,都可以搞个反编译器出来直接秒。不过好像就连rust,go这种都没有专门的反编译器,可能就还早了。。。

这次SCTF,某出题人叫我试试他出的题,然后就被恶心到了。

我本身是不喜欢去研究那些什么结构之类的东西,因为不一样的格式太多了,每个都研究显然是不高效的,我想找到一个可能的通解去研究某些问题

因为这不是python系列的第一篇了,所以这里只说一下我想的新方法。

Cython

cython是什么-CSDN博客

Cython是一个语言:完全包含python语言和部分包含C语言和魔改C语言的集合。它由python实现用于写python模块。文件后缀是pyx,它的作用在于提高python的速度,编译过程:pyx->c->pyd/so(分别为Windows,linux)

可以尝试自写一个pyx文件生成pyd后用ida打开pyd文件,发现内容和原来的内容已经截然不同,可以说根本没有辨识度,极难分析。但是可以发现pyd都调用了python.dll的函数,其中所有运算符都在其中有对应的函数。我在想是不是可以通过这个方法来得到pyd的执行流程。

Hook,启动!

frida:挂钩时间在python层hook后第一次执行hook函数。好像不能全部hook,所以只hook基本运算函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const functionsToHook = [
"PyNumber_Add",
"PyNumber_Subtract",
"PyNumber_Multiply",
"PyNumber_TrueDivide",
"PyNumber_Or",
"PyNumber_Xor",
"PyNumber_And",
"PyNumber_Lshift",
"PyNumber_Rshift",
"PyObject_GetItem"
];

functionsToHook.forEach(functionName => {
Interceptor.attach(Module.getExportByName("python38.dll", functionName), {
onEnter: function (args) {
let argsArray = [];
try {
argsArray.push(args[0]);
argsArray.push(args[1]);
} catch (e) {
console.log(`Error reading arguments: ${e}`);
}
console.log(argsArray);
send({ function: functionName, arguments: argsArray });
},
onLeave: function (retval) {
send({ function: functionName, returnValue: retval });
}
});
});

然后测试,结果失败了。QAQ因为这些函数的传参和传出都是python的值对象。所以要找个方法去解析那些对象。以及最后的比较不知道是什么函数,要知道最后的密文需要hook这个函数。

尝试先使用ida动调python,看看里面的值对象的空间是怎么样的。