BUUCTF - [2019红帽杯]easyRE

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了,这题真是不容易

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值