ZJCTF预赛一个.py的逆向题

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 from hashlib import sha256
 4 def xor(a,b):
 5     result = []
 6     for (i, j) in zip(a, b):
 7         result.append(chr(ord(i) ^ ord(j)))
 8     return "".join(result)
 9 def HASH(msg):
10     return sha256(msg).digest()[:8]
11 def zjctf_encrypt(gen_keys, hahahah):
12     i = 0
13     d1 = hahahah[:8]
14     d2 = hahahah[8:]
15     for i in gen_keys:
16         d1 = xor(xor(HASH(d2),i),d1)
17         d1, d2 = d2, d1
18     return d2 + d1
19 def gen_keymap(key):
20     maps = []
21     _ = key
22     for i in range(16):
23         _ = HASH(_)
24         maps.append(_)
25     return maps
26 def encrypt(key, data):
27     keys = gen_keymap(key)
28     return zjctf_encrypt(keys, data).encode('hex')
29 if __name__ == "__main__":
30     result = encrypt("zzzzzjctffffffff", "This_is_the_flag")
31     print(result)
32     # your result = 1b3a0152bef25769f384a740aa189e78

做题提示是利用xor解决,下载下来发现是一个py文件。

首先把 "zzzzzjctffffffff", "This_is_the_flag" 这俩参数传进 encrypt()中,

gen_keymap() 对  "zzzzzjctffffffff" 进行 HASH 处理 返回一个maps

zjctf_encrypt() 把这个maps与 "This_is_the_flag"  进行切片和异或 返回d2+d1 并输出

 

解密代码如下:

 1 from hashlib import sha256
 2 def xor(a,b):
 3     result = []
 4     for (i, j) in zip(a, b):
 5         result.append(chr(ord(i) ^ ord(j)))
 6     return "".join(result)
 7 def HASH(msg):
 8     return sha256(msg).digest()[:8]
 9 def zjctf_encrypt(gen_keys, hahahah):
10     i = 0
11     d1 = hahahah[:8]
12     d2 = hahahah[8:]
13     d1, d2 = d2, d1
14     for i in gen_keys:
15         d2= xor(xor(HASH(d1),d2),i)
16         d1, d2 = d2, d1
17     return d1+d2
18 def gen_keymap(key):
19     maps = []
20     _ = key
21     for i in xrange(16):
22         _ = HASH(_)
23         maps.append(_)
24     maps.reverse()
25     return maps
26 def encrypt(key, data):
27     keys = gen_keymap(key)
28     return zjctf_encrypt(keys, data)
29 
30 key="zzzzzjctffffffff"
31 result = '1b3a0152bef25769f384a740aa189e78'
32 result=result.decode('hex')
33 print encrypt(key, result)

 这题考察的不仅是python的语法,还考察了对hashlib库的使用,加密算法的了解。

你可能感兴趣的:(ZJCTF预赛一个.py的逆向题)