ZJCTF予選1つpyの逆問題

9671 ワード

 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ファイルであることを発見します.
まず「zzzzzjctffffff」「This_is_the_flag」の2つのパラメータをencrypt()に伝達し、
gen_keymap()は「zzzzzjctffffff」をHASH処理してmapsを返す
zjctf_encrypt()は、このmapsを「This_is_the_flag」とスライスし、d 2+d 1に戻して出力する
 
復号コードは次のとおりです.
 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ライブラリの使用,暗号化アルゴリズムの理解も考察した.