SCTF_RE_复现
死磕了那么久,还是没搞出来QAQ,太菜了,还是,不过这个WP给我了些做这种语言类题目的想法。按WP的方法复现了一下,确实可以直接出
ez_cython
对于这类题目,以往我只会hook一下传入参数和返回值。但是这个WP通过构造自己的类使其返回了符号值从而直接打印流程,十分NB,具体代码如下:
1  | import cy  | 
根据输出可以一眼看出是xxtea
然后直接写XXTEA脚本就好QAQ
1  | //main.cpp  | 
1  | //Arr.h  | 
1  | //Arr.cpp  | 
我一开始是想使用frida和python setattr一起搞的,最后失败了QAQ。
我现在在想,会不会对于那些语言形成的混淆,其实可以用语言本身的特性去解决,至少对于解释型语言似乎重点都在混淆里面,那么对于Java的so文件,似乎也可以这样?如果加密是传入一个byte[]类型,那我继承byte生成自己的类传进去,似乎就没有问题了。
再往编译型语言看看,像rust,go似乎都是直接看汇编比看ida反编译的更好。但是如果他们写成dll似乎也可以被我们主动触发。而剩下的exe类型,还是直接让之后专门的反编译器来解决吧。
我觉得像这种语言层面的混淆,会随着语言变多/发展而愈来愈多,所以我觉得深入研究某个语言的内容是不划算的(除非专门研究某个语言的逆向,但是这样也可能遇到很多不开源的框架,对于框架来说,我们也很难分析)。那么对于这些内容,我们为了理清逻辑,更应该使用通解:HOOK?来获取具体流程。
关于我一开始的方法:frida_hook py38.dll的运算函数
hook到的永远是一个地址,且如果先传给python再解引用会导致一些bug,frida直接解引用也会导致bug。
所以还是要看一下具体的偏移
1  | typedef struct _object {//定长类型  | 
1  | typedef struct {//float为定长类型  | 
3. Object 的基本结构 - Think In Python
cpython/Include/cpython/longintrepr.h at main · python/cpython (github.com)
根据如上去查找PyObject_HEAD,发现:
1  | 
1  | typedef struct _object {  | 
其中_PyObject_HEAD_EXTRA被定义为NULL,Py_ssize_t为int64,struct _typeobject *是指针也为64
所以这里有16字节
1  | typedef struct _PyLongValue {  | 
lv_tag保存了
1  | 低2位:符号信息:0:正数,1:0,2:-1  | 
ob_digit为数组,存放无符号整型,会放30位内容进去,作为值
Python 3 的 int 类型详解(为什么 int 不存在溢出问题?) - 长安223 - 博客园 (cnblogs.com)
4. Long Object 初探 - Think In Python
那么我们可以直接使用以下转换函数来转换
1  | function getNumber(Nptr){  | 
根据测试,这个可以hook出正确的值,但是乘法不对,似乎和底层实现有关,QAQ有没有佬教教我
hook出的每轮的值
1  | [*] Function PyNumber_And called with arguments: ['0x9e3779ce', '0xffffffff']  | 
感觉还是很对的。




