CTF|BUUOJ [2019红帽杯]easyRE

Start
IDA,Shift+F12
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

跟进去,交叉引用
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

F5来到该函数
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

关键处
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

sub_424BA0可以看出应该是strlen,先判断v53的长度是不是36位,之后作为for循环推出的条件。
每一次都会对v53的单个字符与i进行异或之后判断是否等于下面这一串中的值
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

写出脚本:
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

得到第一条信息,the first four chars are 'flag'
continue: 【CTF|BUUOJ [2019红帽杯]easyRE】CTF|BUUOJ [2019红帽杯]easyRE
文章图片

v56调用了10次sub_400E44进行处理,最后与off_6CC090进行sub_400360,根据经验,sub_400360应该就是strcmp
off_6CC090: CTF|BUUOJ [2019红帽杯]easyRE
文章图片

CTF|BUUOJ [2019红帽杯]easyRE
文章图片

来到sub_400E44
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

这里if就是判断v1是否等于39, 条件成立,v2 = 13
之后进入while循环,每次循环都对a1中的三个值进行运算,之后存到v9
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

到这里,大概可以看出是一种加密算法。根据最终的结果,猜测应该就是base64加密,并且加密了10次,
将数据整理之后变成了

Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==

拿去base64解密,刚好解了10次,得到一个网址
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

所以发现这里是个坑,这里不是正确的flag, 翻了一下官方的wp才知道,这个字符串是关键,当时看到off_6CC090的时候并没有在意
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

试着交叉引用
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

这里对byte_6CC0A0[0]byte_6CC0A3v2的第一个字符和第四个字符异或之后进行了判断也就是第一个字符和第四个字符进行判断,根据之前得到的flag前四个字符是flag
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

通过该循环可以发现,v24字节的数,并且是随机获取的,但可以通过if条件里面的语句反推出v2的值
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

if里面的for循环,这里每一次异或得到的值就是真正的flag
CTF|BUUOJ [2019红帽杯]easyRE
文章图片

exp.py
s1 = 'flag' v2 = [] flag = '' enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B] for i in range(4): v2.append(enc[i] ^ ord(s1[i]))for i in range(len(enc)): flag += chr(v2[i % 4] ^ enc[i])# flag{Act1ve_Defen5e_Test}

总结:
这道题坑的地方就在于,不知道踩坑了,也不知道是base64加密,然后就去疯狂的逆算法,最后发现是个坑,hhhhhh,考的是心态

End

    推荐阅读