您的位置:首页 > 编程语言 > Python开发

CTF 【每日一题20160630】PYTHON 字节码

2016-07-01 22:47 453 查看
来源:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=45

python ByteCode

请看这里: http://pan.baidu.com/s/1jGpB8DS

下载后是一个名为 crackme.pyc文件

python逆向基础资源:

用 Python 反编译 Python 软件:http://bbs.pediy.com/archive/index.php?t-111428.html

工具uncompyle2:https://github.com/wibiti/uncompyle2

本题分析:

1.话说用python中的dis模块可以自己编个反编译程序,但是我目前不会,就不罗嗦了。下载uncompyle2后,可以在终端进入uncompyle2目录下,找到setup.py,就可运行下列命令执行安装:

python setup.py install


如果要反编译*.pyc程序,可以运行下列命令:

python C:\Python27\Scripts\uncompyle2 crackme.pyc  > crackme.py


其他用法

Examples:
uncompyle2      foo.pyc bar.pyc       # decompile foo.pyc, bar.pyc to stdout
uncompyle2 -o . foo.pyc bar.pyc       # decompile to ./foo.pyc_dis and ./bar.pyc_dis
uncompyle2 -o /tmp /usr/lib/python1.5 # decompile whole library


然后在同目录下打开生成的crackme.py

我反编译出来的内容如下:

# 2016.06.30 18:21:49 中国标准时间
#Embedded file name: d:/idf.py
def encrypt(key, seed, string):
rst = []
for v in string:
rst.append((ord(v) + seed ^ ord(key[seed])) % 255)
seed = (seed + 1) % len(key)

return rst
if __name__ == '__main__':
print "Welcome to idf's python crackme"
flag = input('Enter the Flag: ')
KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'
KEY2 = [124,
48,
52,
59,
164,
50,
37,
62,
67,
52,
48,
6,
1,
122,
3,
22,
72,
1,
1,
14,
46,
27,
232]
en_out = encrypt(KEY1, 5, flag)
if KEY2 == en_out:
print 'You Win'
else:
print 'Try Again !'
+++ okay decompyling crackme.pyc
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
# 2016.06.30 18:21:50 中国标准时间


2.从程序看,KEY2内的整数似乎像ascii数值,但数字和英文字符少,直接转换意义不大。关键在于分析encrypt(KEY1, 5, flag)。

3.对encrypt函数的分析:用户输入一个字符串(ascii值必小于128),然后取出每个字符求其ascii值,加上seed,然后用其和与KEY1中一字符的ascii进行异或(算符^,注意+比^的优先级高),然后对255求余。

4.编写解密程序。显然正确的密码字符串加密后结果为KEY2,那么逆向分析编码即可。程序如下:

#python script
KEY2 = [124,
48,
52,
59,
164,
50,
37,
62,
67,
52,
48,
6,
1,
122,
3,
22,
72,
1,
1,
14,
46,
27,
232]
KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'

def encrypt(key, seed, string):
rst = []
for v in string:
rst.append((ord(v) + seed ^ ord(key[seed])) % 255)
seed = (seed + 1) % len(key)

return rst

def decrypt(key,seed,en_out ):
string = ''
for i in en_out :
v = (i ^ ord(key[seed]))-seed
seed = (seed + 1) % len(key)
if v > 0:
string += chr(v)
return string

if __name__ == '__main__':
print decrypt(KEY1,5,KEY2)


答案:WCTF{ILOVEPYTHONSOMUCH}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CTF