buuctf [2019红帽杯]easyRE

这是一道签到题,只不过比较搞,被骗了两次。

切入点:

        个人认为这道题的切入点最好的就应该是从它要输出的字符串切入

         很明显从这里可以进入将可以看到函数主要过程,我们双击跟进。

         按‘x’查看引用,发现只有一个引用,跟过去。

        

        这个伪代码比较长,不要着急,我们大致来分析下这一大串代码的逻辑。这两个memset是一个很明显的暗示,基本上memset的下面都会有scanf输入函数,所以猜测v15和v18是我们的字符串。同样的if判断里面的那个函数是strlen,这里我一个把它的名字改了。

        第一个if里面的大致逻辑我们已经可以知道了,有个小问题就是其实v12,v13,v14的内存是连在一起的,所以可以把v12,v13,v14合在一起当做一个数组来看,不然在这个if里面的v12数组会越界。所以我们写一个小脚本看看输入的v15是什么

v12=[0x49, 0x6F, 0x64, 0x6C, 0x3E, 0x51, 0x6E, 0x62, 0x28, 0x6F, 0x63, 0x79, 0x7F, 0x79, 0x2E, 0x69, 0x7F, 0x64, 0x60, 0x33, 0x77, 0x7D, 0x77, 0x65, 0x6B, 0x39, 0x7B, 0x69, 0x79, 0x3D, 0x7E, 0x79, 0x4C, 0x40, 0x45, 0x43]
v15=""
for i in range(len(v12)):
    v15+=chr(v12[i]^i)
print(v15)

#输出结果为 Info:The first four chars are `flag`

很明显这输出是一个带有一点点提示的坑,没关系我们的下面还有代码没分析,接着往下分析。

黄色部分不用想就是strcmp函数,然后就是这一串的相同的函数比较吓人,进去看看。

这个也看不太明白,再看看汇编代码

 这个吸引了我的注意力,过去看看

 这不就是原版base64吗,所以我们退回去,猜测那些函数都是base64的函数,所以这段逻辑已经清晰,输入->许多base64->比较

 对这个里面的的东西不断base64解码,看看是什么

最后得到一个链接,很明显又被坑了,这时候注意到在刚刚的位置下面有一堆奇怪的数字

 就想刚开始一样按‘x’看看引用

很明显这是在同一个函数中的引用,跟过去简单分析一下代码

 这些伪代码看起来比较奇怪,我们再看看汇编,与伪代码对应一下提高效率

大致分析一下,看不太明白没有关系,最后知道v1在for循环后是一个固定的值,然后赋值给v4,接下来在这个if里面注意这个HIBYTE这个意思是取出V4最高位的字节,取出v1的最低位字节。再与它异或的数据一一对应,猜测v1和v4依次异或的结果其实就是“flag”,这刚好就与最开始的脚本结果相一致了Info:The first four chars are `flag`,所以分析得出v4,v1其实是已知的数据了。

 

 最后就是循环的取出v4的各个字节与数据段异或

解题脚本为

a=[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]
b=['f','l','a','g']
c=[]
for i in range(4):
    c.append(a[i]^ord(b[i]))
for i in range(len(a)):
    print(chr(a[i]^c[i%4]),end="")

 得出flag为flag{Act1ve_Defen5e_Test}

总结

这道题让我深刻认识到了逆向的猜想的特性,有一部分题都是这样的,要从字符串,或者一些数据作为切入点,通过交叉引用的方法找到主函数的地方,分析一部分函数时可能没必要弄懂其中的作用,可以先把了解的东西推完再看看它是否对于整个逻辑有影响。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值