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

IDF 逆向题 python ByteCode

2015-06-12 10:54 627 查看
网站地址:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=45

进入后会获得一个.pyc文件,扔到http://tool.lu/pyc这个网站,获得程序的源码:

#coding=utf-8
#!/usr/bin/env python
# encoding: utf-8
# 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc

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 !'


发现一个坑爹的算法:

seed = (seed + 1) % len(key)


对余数求逆对我等小白来说,有点麻烦,索性代码不多,字节暴力猜解一下,代码如下:

#coding=utf-8
def encrypt(key, seed, v):
return (ord(v) + seed ^ ord(key[seed])) % 255
if __name__=='__main__':
s=['_','{','}'];
flag1='a';
flag2='A';
for i in range(26):
k=ord(flag1)+i;
k1=ord(flag2)+i
s.append(chr(k));
s.append(chr(k1));
KEY2 = [
124,
48,
52,
59,
164,
50,
37,
62,
67,
52,
48,
6,
1,
122,
3,
22,
72,
1,
1,
14,
46,
27,
232]
answer=[]
seed=5;
key= 'Maybe you are good at decryptint Byte Code, have a try!'
for i in range(23):
t=0;
for j in s:
if encrypt(key,seed,j)==KEY2[i]:
t=1;                                  #判断是否匹配到了,若没有加大字符库即可啦
answer.append(j);
print t;
seed = (seed + 1) % len(key)
print ''.join(answer);




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