那晚c和python都喝醉了
最近新做了一种题型,感觉以后考的应该挺多的,然后干脆放一起总结一下吧,因为也算是re入门的一部分Y(^o^)Y
python解包
首先拿到一个exe文件它的外形长这样,基本就是用pyinsatller打包的exe文件
用工具查一下有pyinsatller显示出来
python逆向基础流程(纯小白教程)_python exe逆向-CSDN博客
解法也很简单下一个pyinstxtractor,放一个文件夹下解包就可以了,这个是正统的方法
像我这种不正经的人就会想歪门邪道用在线的,但是孩子们不要学歪哈(^_^)
解开之后拿到pyc文件,然后用一个库拿到py文件,当然也有快速的方法,但是太求速度也不好,尽量知道正常的怎么做
1 | uncompyle6 文件名.pyc>文件名.py.(要在pyc文件所在目录) |
但是如果python版本太高的话就只能转换成字节码了,什么你不知道什么是python字节码!!!
那快去学一下把ヽ(✿゚▽゚)ノ
pyc.encrypted
这一类也挺简单的没什么难度,只是在上面的基础上对要分析的pyc进行了加密,只要用加密脚本去掉加密正常分析就可以了
我爱看小品
下载附件是一个elf文件,我们把它放到kili里运行,遇到了像下面的报错
1 | ┌──(root㉿kali)-[~] |
ai一下发现是打包过的文件
在kali上对文件进行解包
1 | python3 '/root/桌面/pyinstxtractor/pyinstxtractor-2025.02/pyinstxtractor.py' '/root/桌面/something' |
运行之后发现有一个文件出现在当前的文件夹下,把它移到桌面上打开会发现something.pyc
用这个网站在线Python pyc文件编译与反编译
对pyc反编译得到下面的一个主函数
可以发现其它的函数都有定义,关键在于mypy文件里内容
1 | # Visit https://www.lddgo.net/string/pyc-compile-decompile for more information |
在文件夹内发现/PYZ-00.pyz_extracted文件夹里有mypy.pyc但是被加密了有一个. encrypted的后缀,需要把它解出来,这里有一篇文章写着很详细做法
在Python中反编译加密的pyc文件 - 我也是个傻瓜 - 博客园
key在/root/桌面/something_extracted/的pyimod00_crypto_key文件中
用脚本把文件解密,记得修改路径和key还有python的版本头文件
1 | import glob |
这个时候再打开发现都变成了 pyc文件,反汇编一下
myfun函数长这样,把flag里面的部分分成三段进行解密就可以了
1 | # Visit https://www.lddgo.net/string/pyc-compile-decompile for more information |
写一下脚本
1 | def decrypt(): |
Cython逆向
pyd文件相当于dll文件,也就是动态链接库的概念,它不能像pyc一样直接打出字节码,只能反汇编
如果可以的话试试自己写一个pyd,可以发现混淆挺严重的,逆向难度大大提升,我们只能使用朴素的方法直接ida
做题步骤:①先打印观察引用的库,导出函数
②看python版本
③ida打开,查看字符串,数据
④跳到实现函数,动调或者看库函数分析逻辑
当然,还有用注入pyd的方法,看到里面的加密方法,
感觉要是利用好注入和动调的话,这种题简直就是易如反掌
但是主要是我现在知识浅薄还不会那么写脚本::>_<::
还是要多加努力✊
moon
拿到文件先看一下主函数,用了moon.pyd里面的check函数
1 | import moon |
因为pyd类似于dll,无法像pyc一样拿到源码所以我们用ida来逆向一下逻辑,为了看清里面的逻辑我们先借助python中的函数查看一下pyd里面的内容
里面有两个函数一个是check一个是xor,大概能猜到是先经过异或然后检验一下flag是否正确。
用ida打开,试了一下发现用两种方法可以找到具体的实现函数。
①如果你是用1这个地方引用的话,直接引用到data字段,字符串下面是另一个函数指针,指向实际实现
check_flag
功能的函数,然后点进去一般return的第一个函数就是你要的功能函数
②如果是用2这个地方引用的话,第一行引用是这个函数的包装函数,第二行才是这函数的内部实现
,但也有可能会有超过两行的情况,看一下偏移其实大差不差,点进去的函数,就是我们要分析的函数内部
ok,首先让我们先找到 模块状态
来分析一下里面都有什么,就是这个东西,可以看出里面有seed和一个16进制的字符串,还有random,和我们利用python打印出的模块也差不多可能是random.seed去生成随机数。
这个off_18000B618就是模块全局字典,没太看懂里面是什么意思
我们再去找一下我们打印出的check和xor函数
找到函数之后我们就可以开始分析了,很多东西都可以从红色的一些库函数来了解程序的走向,在check函数中我们可以看到比较的函数,剩下的就是获取对象之类的函数,因为是对比函数,所以只要我们输入的和python对象加载的flag一样就好了,所以我们跑到xor函数大概就知道要我们输入的是什么了
xor函数里面发现一个异或函数,找到这里发现他是异或完加到一个列表后面,这个v8在后面找一下会发现是在PyDict_GetItem_KnownHash这个函数这边对模块全局字典引用可以发现是一个种子
这个种子就是刚刚用函数打印出来的1131796,大致就是用这个种子生成了随机数,然后16进制密文去异或随机数得到flag
静态
1 | import random |
动态
在PyObject_RichCompare和PyNumber_Xor上下断点,然后附加在python3.11exe上动调,这里我的输入是好多a,试了一下发现这里异或的数值都是不变的,然后直接f9到PyObject_RichCompare
回到PyNumber_Xor把异或后得到的数据提出来,然后异或回去得到随机数
最后得到flag
rand0m
首先拿到一个pyd
先用help和dir查看模块内的函数和类的用法
1 | import rand0m |
大致了解一下里面有rand0m和check函数
用ida打开分析一下,首先先看字符串,找到函数对应的字符串,找到函数实现部分
然后结合动调对函数里面进行分析
然后可以知道rand0m里面的进行了什么操作
1 | def rand0m(x): |
再对check函数进行动调可以发现,在4660函数部分进行了跳转,也就是先初始化了数组,然后进行rand0m里面的操作
到这里就差不多了
逆向与操作的通用方法
如果已知 A & B = C
,并且知道 A
或 B
中的一个,可以部分恢复另一个:
- 如果
A
的某位是0
,则B
的该位 无法确定(因为0 & B = 0
,无论B
是0
还是1
)。 - 如果
A
的某位是1
,则B
的该位 必须等于C
的对应位(因为1 & B = B
)。
直接爆破一下
1 | ''' |
在别的地方看到了一个十分有意思的做法,用hook注入来看数据加密的过程
第十八届信息安全大赛 && 第二届长城杯 - re-先知社区
1 | class Symbol: |
ヽ(✿゚▽゚)ノ
ez-cython
首先解包,可以看到主代码
关键是运用了pyd里面的一个函数,先查看一下pyd里面有哪些类
1 | import cy |
从输出可以看到有一个自定义类**QOOQOOQOOQOOOQ
**,大概可以猜到是用来生成key的,然后有三个函数,一个用来检查flag的,另外两个用于加密
1 | ['QOOQOOQOOQOOOQ', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__test__', 'sub14514', 'sub50520', 'sub50804'] |
打开pyd文件先找到了14514函数,分析一下看到了PyObject_RichCompare对比函数
对50804函数进行分析可以看到都是异或和位移弄在一起,
对50520函数进行分析可以看到都是与运算。
反正就这么一步步看
所以可以得到50804函数里面的东西是这个
其实按这个步骤再分析50520函数就行,但是我实在脑子要炸掉了
1 | def shift(a, b, c, d, e, f): |
这次直接采用直接注入的方式试一试,运行之后可以发现里面的加密过程,直接逆
1 | import cy |
中间其实还有很多的,我简略一些
1 | new_a[1] = ((a[1] + ((((a[1] >> 3) ^ (a[1] << 3)) + ((a[1] >> 4) ^ (a[1] << 2))) ^ ((a[1] ^ 2654435769) + (a[1] ^ 49)))) & 4294967295) |
然后用爆出来的直接写个逆过来的脚本
因为一共进行了5轮加密,每轮32次加密O(∩_∩)O~~
1 | en1 = [2654435769, 1013904242, 3668340011, 2027808484, 387276957] |
总结
本意是想记录一下自己学cython的过程
确实挺麻烦的,要自己理逻辑分析,动调真的排上大用场了,感觉自己动调有一点长进吧,至少有的时候知道下在哪了
现在还不熟悉动调也没关系,多练练就好了b( ̄▽ ̄)d