BUUCTF - [2019红帽杯]easyRE
个人认为这道题是最近我刷的题目中难度较高的了,也是自己能力问题,不多说了,开始做题
这篇文章配图规律为,图片在上文字在下,希望大家还看到习惯
拖入die分析,elf64位文件,打开Linux跑跑看
输错就退出,毫不讲理…
那咱直接上静态分析吧,这里跟大家说一下哈,我的做题的习惯一般是静态分析无果,才去寻求动态调试,并不是说这道题用动态的方法做不出来,有能力的师傅可以自己去动态,我就继续坚持我的习惯了。
shift+F12看看字符,看到字符表,肯定用到了base64编码,多注意,跟踪字符串You found me!!!,接着分析
跟踪到sub_4009C6函数,这题中没找到main入口,那就顺着sub_4009C6继续分析
进入sub_4009C6函数,这次ida识别函数有点问题,咱们自己尝试标注一下,猜测sub_410CC0为printf函数
通过这个for循环和比较,判断sub_424BA0为strlen函数,而且当函数内层循环条件满足时,会跳去函数末尾,肯定是不行的,所以
(v15[i] ^ i) == v12[i] 这个式子要一直成立
先给v15置零,又对v15调用,猜测v15为输入字符串,sub_4406E0函数为gets
经过咱们的一顿分析,得到了这样的伪代码:
咱们已经有了足够的信息来解出第一部分,来让我们继续逆向了,来写脚本吧,给它异或回去
flag = ""
now = [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]
for i in range(len(now)):
flag += chr(now[i]^i)
print(flag)
Info:The first four chars are `flag`
本来以为能得到一部分flag的,看来还是想简单了,继续分析
连续调用了10次sub_400E44函数后与off_6CC090处数据进行比较,之前咱们看到程序中出现了base64密码表,尝试一下,解码10次
就是这一堆数据,解码后得到个网址:https://bbs.pediy.com/thread-254172.htm,讲的是主动防御,即引导ctfer做出错误答案,好家伙,做题做出心理学了…
这里还有个交叉引用,跟进一下
感觉发现了挺有意思的东西,接着分析
有这样一个函数,还会检测数组中是否有’f’,'g’字符出现,我觉得判断flag的函数应该就是这个了
v4和v1这数值,也太难判断了,但因为是int型4字节,不如就直接通过两个异或表达式判断吧,因为是小端序,所以宏函数HIBYTE取的是最后一个字节,数组存储在计算机中为线性排列,所以byte_6CC0A3即为byte_6CC0A0[3]
根据题意写出脚本
data=[64, 53, 32, 86, 93, 24, 34, 69, 23, 47,
36, 110, 98, 60, 39, 84, 72, 108, 36, 110,
114, 60, 50, 69, 91]
xor_key='flag'
key=[]
flag=""
for x in range(4):
key.append(chr(data[x] ^ ord(xor_key[x])))
for i in range(25):
flag+=chr(data[i]^ord(key[i%4]))
print(flag)
flag{Act1ve_Defen5e_Test}
终于得到flag了,这题真是不容易
g+=chr(data[i]^ord(key[i%4]))
print(flag)
flag{Act1ve_Defen5e_Test}
终于得到flag了,这题真是不容易