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'] |
感觉还是很对的。