这个题目好文艺啊~
最近处于各种杂事中,希望一切都有好结果~
题目链接:http://ctf5.shiyanbar.com/DUTCTF/reverse300.pyc
看上去是个python,有点意思,开始解题吧~
1、第一次反编译python文件,不知道用啥,先拖进Exeinfo PE中看下吧,emmmm好像不支持哈,尴尬了。
2、经过搜索,pyc文件要使用uncompyle2。
github下载地址:https://github.com/wibiti/uncompyle2
下载后使用管理员身份打开cmd(windows下),然后输入:
python setup.py install
同样管理员身份打开cmd,进入到uncompyle2的安装路径下使用(可以设置环境变量直接使用),先复制reverse300进去。
python uncompyle2 -o result.py reverse300.pyc
3、打开result.py看源码:
4、进行分析:
(1)main函数部分:
if __name__ == '__main__':
if len(sys.argv) < 3:
exit(1)
ex = 20
for i in range(1, len(sys.argv), 2):
a = sys.argv[i]
b = sys.argv[i + 1]
if a == '-t':
ex = int(b)
elif a == '-e':
encoded = authcode(b, 'ENCODE', expiry=ex)
print encoded
elif a == '-d':
decoded = authcode(b, 'DECODE', expiry=ex)
print decoded
其中:sys.argv 是获取运行python文件的时候命令行参数,且以list形式存储参数,就是在cmd执行的时候的参数,对于sys.argv 。
若执行:
python result.py
则返回:[' result.py'],len为1
若后面还有参数,则加到列表中。
(2)看函数逻辑肯定是进行解密啦,也就是输入:
python result.py -d 0be6770IigHXZpz9hQYR1fpl15R0z9MUalmYEPhJeEN/sRklL6wQw5yQ7SAyT6tKGJNY0AxnyzS/L7zWQII=
(3)但是如果这样的话会没有结果输出,看一下decode是怎么写的:
if operation == 'DECODE':
if not result[0:10].isdigit() or int(result[0:10]) == 0 or int(result[0:10]) - int(time()) > 0:
if result[10:26] == md5(result[26:].encode('utf-8') + keyb).hexdigest()[0:16]:
return result[26:]
else:
return ''
else:
return ''
result是经过一系列操作得来的,但是这个判断条件和time进行判断也太玄学了吧。
直接删掉,变成:
if operation == 'DECODE':
if result[10:26] == md5(result[26:].encode('utf-8') + keyb).hexdigest()[0:16]:
return result[26:]
然后执行就可以了:
小结:今天学到了python反编译,加油!
网友评论