2022春秋杯-春季赛-逆向题ezam分析

准备工作

使用die查壳得到64位无壳,于是乎用ida 64打开,看到如下图所示:

在这里插入图片描述

F5反汇编查看是一堆while语句和switch语句的组合,由此判断需要去控制流平坦化。

去控制流平坦化

这时需要用到angr。安装过程如下:

#在windows里用

pip install angr

#我自己试了试linux里安装用不了,当然你也可以尝试一下

#运行报错的话,就用windows安装叭,当然linux还有别的方法可以装,自己去找吧

然后需要用到两个脚本,脚本自己网上搜(控制流平坦化脚本),我就不留了。

我们记一下main函数的入口地址:0x4008F0

然后用执行:

python deflat.py ezam 0x4008F0

执行完后会用ida64查看生成的ezam_recovered文件,发现一个函数sub_400670,跟进去看看,如下图所示:

在这里插入图片描述

只能说,好家伙,还得去一次,于是再次执行:

python deflat.py ezam_recovered 0x400670

跑完程序,查看一番,控制流平坦化已全部成功去除了。

分析反汇编

去除控制流平坦化的程序反汇编如下图所示:

在这里插入图片描述

分析了一下,没有跟输入的变量input有关的,不看这里,往下分析,发现该分析刚刚发现的那个函数了。

在这里插入图片描述

上图分析到v22为我们输入的数据,这个数据被sub_400670这个函数做了处理,跟进去看一下怎么处理的。
在这里插入图片描述

上图分析出v21的值被改动了,写个脚本模拟一下,看看改动的结果是啥。**(这里记一下v10=45,后面会用到)**脚本如下:

def toFour(source):
    a=list(str(source))
    b=[1]*45
    c=45
    v9=0
    flag=True
    while flag:
        c -= 1
        if c==0:
            flag = False
        v7 = 0
        v6 = 0
        for i in range(v9,len(a)):
            v8=int(a[i])- -10*v7
            a[i]=v8//4
            v7=v8%4
            if v6==0:
                if int(a[i]):
                    v9=i
                    v6=1
        b[c]=v7
    return b
if __name__=='__main__':
    reFour=toFour(1234)
    print(reFour)

测试结果发现输出的结果为输入的十进制转换而来的四进制,故这个函数所作的变换为十进制转四进制,而十进制的值应该就是我们需要的flag了。

退出这个函数继续往下分析,由下图分析可猜测是迷宫游戏:

在这里插入图片描述

因此我们只需要找出地图即可,分析出v20为地图矩阵,网上看可以看到v20的构造代码,代码图如下:

在这里插入图片描述

这看起来也太复杂了吧,,,,那就gdb分析叭。将断点下在下图箭头处,查看地址为0x401466

gdb载入,

b *0x401466
r

程序跑起来,然后随便输入几个数字,断下,可以看到ebx为0x180也就是十进制的384ecx为0xc,也就是for循环跳出的判断值,此时断下的位置即为初始化v20变量完毕的位置。如下图所示:

在这里插入图片描述

此时我们回代码处查看一下v20的寄存器地址为rbp-210h,如下图所示:

在这里插入图片描述

此时我们取出这个寄存器的内容,代码为

x /384db $rbp-0x210

,不懂这个指令的自行搜索(gdb查看寄存器指令),如下图所示:

在这里插入图片描述

得到矩阵数据后,将矩阵排列成24*16的矩阵,如下图所示:

在这里插入图片描述

由于之前分析终点位置为v5=823,即第9行第24位为出口,v5的初始值为0,即出发点在左上角处,于是通过上下左右的代号,得出两组数据:

232222322330030000303322223333333222233333333

232222322330030000303322222222222333333300033333333

第一行刚为45位数,刚好满足转四进制函数里v10的处理个数,故将其转为十进制得到(转换地址:https://tool.lu/hexconvert/)

flag{902741462666576198076399615}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值