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学的真的啥也不是....
以上。