逆向win.pyc
運行win.pyc,要求輸出’You Win’代表成功,
先用軟體反編譯win.pyc,

得到它源代碼:

用編譯器打開:
# 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 !')
源代碼就是一個輸入字串加密,當加密后的結果等于KEY2時輸出“You win!”
那我們就需要反向破解密碼,
但是破解程序中出現了問題,這是剛開始第一次的破解方法:
直接將演算法反向解密:

破解出了正確字串的8位256以內的ascii碼,但是輸入到win.py源代碼中卻失敗了!
后來我思考了一下,ascii碼在128~256中的字符是擴展ascii碼,有些似乎是無法列印的,有可能是這導致了出錯,我得找128以內的ascii碼來代替,
于是有了接下來的第二種破解方法:
通過窮舉,在128以內找到能夠計算出正確KEY2的值:

將新的flag輸入源代碼win.py,結果正確,成功輸出“You win!”

我再比較了來兩次的字串:
第一次:W°??{???ê???H?μ??’?·}
第二次:WCTF{ILOVEPYTHONSOMUCH}
在256以內的ascii碼中有些字符是無法列印的,而在128以內所有的字符都可以列印,
這是正確解密的源代碼:
#KEY1的長度是55
KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'
#KEY2的長度是23
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字串轉換成int陣列
key1 = []
for v in KEY1:
key1.append(ord(v))
#結果字串對應的ascii碼陣列
result = []
#k2
k2 = 0
#k1是key1的下標
for k1 in range(5,28):
#查找128以內符合正確結果的ascii碼
for i in range(128):
if KEY2[k2] == (i + k1 ^ key1[k1]) % 255:
result.append(i)
k2 = k2 + 1
flag = ""
for i in range(23):
flag = flag + chr(result[i])
print("flag的值為:",flag)
運行win.pyc檔案

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250291.html
標籤:python
上一篇:女生生日沒禮物送?
