1.python文件反编译
当一开始拿到题的时候,毫无头绪。这时想要看一下文件的源码,用记事本打开发现是乱码,回看文件类型发现是pyc文件。pyc文件是py文件变成exe文件的中间文件,可以理解为高级语言写的程序要先被编译为汇编语言后变为二进制程序。
那么我们有什么办法将pyc文件变成py文件呢?
这里要说的就是uncompyle工具,功能就是将pyc文件反编译成py文件,具体操作方法是将cmd命令行的指向指向pyc文件所在目录之后,输入如下指令
uncompyle6 -o *.py *.pyc
成功之后会是下图效果,要注意的是要在环境变量中配置的路径是python2的python3会反编译不成功
2.python代码审计
当你得到反编译之后的py文件,就可以用编译器或者记事本查看,得到如下源码
# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.16 (v2.7.16:413a49145e, Mar 4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)]
# Embedded file name: 2.py
# Compiled at: 2020-10-14 11:00:14
import base64
def encode(yourflag):
s = ''
for i in yourflag:
x = ord(i) ^ 62
x = x + 6
s += chr(x)
return base64.b64encode(s)
tureflag = 'XlhlX0sMEWNiDxQQDgwTXl5eZRFgFWMOFBATXhMMYw8PD2UMZUk='
flag = ''
print 'input your flag:'
yourflag = raw_input()
if encode(yourflag) == tureflag:
print 'OHHHHHH~ correct!'
else:
print 'emmm.. wrong'
对源码进行审计,发现源码将真正的flag做了如下处理
3.还原flag
还原flag,我们可以用以下思路
按照如上的思路写脚本,得到如下
import base64
def encode(str):
s = ''
for i in str:
x = ord(i) - 6
x = x ^ 62
s += chr(x)
return s
Base64_Encode_Flag = 'XlhlX0sMEWNiDxQQDgwTXl5eZRFgFWMOFBATXhMMYw8PD2UMZUk='
Base64_Decode_Flag = base64.b64decode(Base64_Encode_Flag)
Flag=encode(Base64_Decode_Flag)
print Flag
运行之后如下图
得到flag