python逆向

使用python2加载python3生成的*.pyc文件也会导致此错误。但似乎有例外

但通常会报出有魔数错误(bad-magic-number-error)以下为Stack Overflow的一篇

魔数错误

re羊城杯 2020 login

pyinstaller编译的exe文件

使用python3

pyinstaller flag.py

在script文件夹里,会生成flag.exe_extracted,在文件夹里找到login

提出index文件加上文件头:

420D0D0A000000000DA91B60A8090000

反汇编 Python 字节码

基本反编译
函数 dis() 打印 Python 代码源(模块、类、方法、函数或代码对象)的反汇编形式。 可以通过从命令行运行 dis 来反汇编诸如 dis_simple.py 之类的模块。

# cat demo.py
i = 1
s = "Python"
d = {}
l = []
# python
…………
>>> source = open("demo.py").read()
>>> co = compile(source, "demo.py", "exec")
>>> import dis
>>> dis.dis(co)
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (i)

2 6 LOAD_CONST 1 ('Python')
9 STORE_NAME 1 (s)

3 12 BUILD_MAP 0
15 STORE_NAME 2 (d)

4 18 BUILD_LIST 0
21 STORE_NAME 3 (l)
24 LOAD_CONST 2 (None)
27 RETURN_VALUE

字节码总结

栈基本操作

LOAD_NAME 压栈

LOAD_GLOBAL 全局变量
LOAD_FAST 局部变量
LOAD_CONST 常量
LOAD_ATTR 对象中的属性

POP_TOP

删除堆栈顶部(TOS)项。

ROT_TWO

交换两个最顶层的堆栈项。

ROT_THREE

将第二个和第三个堆栈项向上提升一个位置,顶项移动到位置三。

DUP_TOP

复制栈顶元素压栈

DUP_TOPX(count)

复制栈顶count个元素再按原顺序压栈 count范围[1,5]

一元操作 一元操作获取堆栈顶部元素,应用操作,并将结果推回堆栈。

UNARY_POSITIVE

实现 TOS = +TOS 。取正

UNARY_NEGATIVE

实现 TOS = -TOS 。取负

UNARY_NOT

实现 TOS = not TOS 。逻辑取反

UNARY_INVERT

实现 TOS = ~TOS 。按位取反

二元操作 从堆栈中删除堆栈顶部(TOS)和第二个最顶层堆栈项(TOS1)。 执行操作,并将结果放回堆栈。

BINARY_POWER

实现 TOS = TOS1 ** TOS 。幂运算

BINARY_MULTIPLY

实现 TOS = TOS1 * TOS 。乘法

BINARY_FLOOR_DIVIDE

实现 TOS = TOS1 // TOS。地板除

BINARY_MODULO

实现 TOS = TOS1 % TOS 取余

BINARY_ADD

实现 TOS = TOS1 + TOS 。加法

BINARY_SUBTRACT

实现 TOS = TOS1 - TOS 。减法

BINARY_LSHIFT

实现 TOS = TOS1 << TOS 。左移

BINARY_LSHIFT

实现 TOS = TOS1 << TOS 。右移

BINARY_AND

实现 TOS = TOS1 & TOS 。与

BINARY_XOR

实现 TOS = TOS1 ^ TOS 。异或

BINARY_OR

实现 TOS = TOS1 | TOS 或

BINARY_SUBSCR

实现 TOS = TOS1[TOS] 。索引

参考链接

python编译后的pyd爆破

python字节码

python字节码官方文档