Classical CrackMe2
真的是學到了很多東西....首先PEID看一下是用C#寫的,所以用dnspy進行反編譯,找到了關鍵的類:
然後點進去發現了關鍵函數,即if比較函數:
也就是text不爲空並且text2等於一個xxxx,在這裏下斷點就發現text是輸入的數據,text2就是每次給出的錯誤彈窗裏面的一串base64,當text2的值等於後面的字符串的時候,彈窗就會顯示flag。那就先來看看text2是怎麼形成的:
然後發現Rijndae1Managed就是AES加密的過程然後再base64轉化一下,key就是bytes數組,在此處下斷點,發現bytes數組的值爲‘pctf2016’*4:
然後再去看看if語句的text2應該等於什麼,在if語句處下斷點,調試看看return的值:
最後,程序的邏輯就比較清晰了,就是把用戶的輸入先AES加密然後base64編碼然後與題目中給出的base64進行比較,上腳本:
import base64
from Crypto.Cipher import AES
cipher = base64.b64decode("x/nzolo0TTIyrEISd4AP1spCzlhSWJ XeNbY81SjPgmk=")
key = "pctf2016pctf2016pctf2016pctf2016"
aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
msg = aes.decrypt(cipher)
print(msg)
這裏就出現了一點小問題,最開始腳本寫的是
aes = AES.new(key, AES.MODE_ECB)
然後出現了錯誤......去百度搜找原因最後調試發現原因:
最開始的key是str類型,要把它變成bytes纔可以進行AES.new().....python學的真的啥也不是....
以上。