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库的使用,加密算法的了解。