[2019红帽杯]easyRE
步骤:
- ida载入,没有main函数,就先检索了程序里的字符串
发现了base64加密的特征字符串,双击you found me跟进,找到了调用它的函数,函数很长,我们分开看 - 首先我们输入的数据与它下表异或后等于数组a
数组a里的值,一开始ida分析出来是v17这种的参数,我改了一部分,太多了没有全部修改完,它这边定义了一个长度为36的数组,数值看图
先写个异或脚本,看一下我们输入的字符串是什么
a = [73,111,100,108,62,81,110,98,40,111,99,121,127,
121,46,105,127,100,96,51,119,125,119,101,107,
57,123,105,121,61,126,121,76,64,69,67]
flag=""
for i in range(36):
flag+=chr(a[i]^i)
print (flag)
看模样都知道不是flag,继续往下看
利用在线解密工具将得到的字符串base64解密10次即可得到我们第二次输入的数据
base64加密10次后的密文
自己python3的base64库出了点问题,就用的在线工具解密
https://bbs.pediy.com/thread-254172.htm
得到了一个网站,进去就是一个看雪的帖子,看网页源码也没找到flag
程序都结束了,还没找到flag,看了其他师傅的wp后才知道,在我们base64加密结束后,下面有调用一个sub_400D35的函数
24行,v5开始的数组和我们已知的一个数组抑或后能得到‘flag’的字样,我们可以反向异或得到v5,之后进行28行的异或操作,得到v2,看看v2是啥
我们以知的数组
v5 = ''
enc1 = 'flag'
v2 = ''
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):
v5 += chr(enc[i] ^ ord(enc1[i]))
print (v5)
for i in range(len(enc)):
v2 += chr(enc[i] ^ ord(v5[i%4]))
print(v2)
flag{Act1ve_Defen5e_Test}