攻防世界逆向-python-trade

    科技2022-08-21  114

    攻防世界逆向-python-trade

    下载附件后看后缀是.pyc的文件

    pyc 文件是 python 编译产生的中间文件。python 是一个先编译再解释型语言。python 解释器由一个编译器和一个虚拟机构成,python.exe 先将源码编译成字节码(即将.py 文件换转成 .pyc 文件),.pyc 不是二进制码,而是一种字节码文件,它是与平台无关的中间代码,不管是在 Windows 还是 Linux 平台都可以执行。运行时再由虚拟机逐行把字节码翻译成目标代码。 执行具体过程:

    PyCodeObject:PyCodeObject 是 Python 编译器真正编译成的结果。当 python 程序运行时,编译的结果则是保存在位于内存中的 PyCodeObject 中,当 Python 程序运行结束时,Python 解释器则将 PyCodeObject 写回到 pyc 文件中。当 python 程序第二次运行时,首先程序会在硬盘中寻找 pyc 文件,如果找到,则直接载入,否则就重复上面的过程。每次加载模块时,如果同时存在.py 和.pyc,Python 会尝试使用.pyc,如果.pyc 的编译时间早于.py 的修改时间,则重新编译.py 并更新.pyc。所以说 pyc 文件其实是 PyCodeObject 的一种持久化保存方式。PyCodeObject 对象的创建时机是模块加载的时候,即 import。Python 解释器只把我们可能重用到的模块持久化成 pyc 文件,见如下的示例。 一般字节码通过反编译都可以很清晰地还原源代码。 为什么需要pyc文件 这个需求太明显了,因为py文件是可以直接看到源码的,如果你是开发商业软件的话,不可能把源码也泄漏出去吧?所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出 py文件源码。

    于是我们反编译之后得到源代码

    import base64 def encode(message): s = '' for i in message: x = ord(i) ^ 32 x = x + 16 s += chr(x) return base64.b64encode(s) correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt' flag = '' print 'Input flag:' flag = raw_input() if encode(flag) == correct: print 'correct' else: print 'wrong'

    ord()函数主要用来返回对应字符的ascii码 print ord(‘a’) #97 chr()主要用来表示ascii码对应的字符他的输入时数字 print chr(97) #a print chr(0x61) #a a为60,b为13

    ^:按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001

    Python模块——base64 base64模块是用来作base64编码解码,常用于小型数据的传输。编码后的数据是一个字符串,其包括a-z、A-Z、0-9、/、+共64个字符,即可用6个字节表示,写出数值就是0-63。

    所以这是编码过程,需要自己再去解码。 写反编译的程序

    运行,得到flag

    Processed: 0.010, SQL: 12