攻防世界逆向高手题之easy_Maze

99 篇文章 32 订阅

攻防世界逆向高手题之easy_Maze

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的easy_Maze
在这里插入图片描述
下载附件,照例扔入exeinfope中查看信息:
在这里插入图片描述
64位ELF文件无壳,照例扔入IDA中查看伪代码信息,有main函数看main函数:
在这里插入图片描述
在这里插入图片描述
这里积累第一个经验:一进去看到一堆变量,三个自定义函数,跟踪进step_0看看代码:
在这里插入图片描述
发现对v7有超过[7]下标的操作,怀疑主函数中一堆变量是v7的数组分出来的,看了一下堆栈,发现是连续的,于是调整主函数栈中局部变量构造:
在这里插入图片描述
在这里插入图片描述

结合题目暗示maze迷宫类型,开始分析三个step函数,第一个step_0函数,第一个红框显示是程序自运行操作,大概是把v7数组按条件给到v6数组:
在这里插入图片描述
第二个step_1函数,也是简单的v6条件赋值给v5,但是这里中间经过两个函数。
在这里插入图片描述
跟踪第一个函数getA,是三层循环嵌套加递归。
在这里插入图片描述
跟踪getAStart函数,也是三层嵌套,到时其中还调用getA函数。
在这里插入图片描述
这里积累第二个经验:
一开始受前面一道EASYHOOK题目的影响,我以为这里会有类似的虚实代码替换。跟踪进去后发现step_1不断嵌套而且没有系统函数替换进程地址,判断不是HOOK。但是由于step_1函数不断的嵌套,而且是那种循环算法的嵌套,我又以为是Newbie_calculations这类有冗余代码代码需要自己简化函数的题目,结果发现也是错的,因为Newbie_calculations的冗余代码作用是消耗时间,而这题也没有消耗时间。
最后查了资料我才明白,这种step_0和step_1代码的确是算法,但是它们在用户输入命令之前,也就是说这些是系统自执行代码,是为程序渲染环境做前期准备用的,没有必要弄懂它。比如这里step_0和step_1是为程序做迷宫地图的,设计迷宫算法,弄懂它与解题没有太大关系,而且前期准备环境的算法函数也不会有故意出错的地方来设考点,毕竟考点是走迷宫。
.
.
理解完这些之后我们看step_2,发现输入cin函数方法在这里,那么我们只要观察输入函数cin之后的逻辑和在内存中截取出前面step_0和step_1函数自动运算生成的地图来参考即可:
在这里插入图片描述

上图第一个框标识走够29步,而且每一步都是1才行。第二个框是cin输入框,是我们定位的关键,后面的框就是打游戏常见的aswd这样来移动,移动到1上面才行。
.
.
所以我们现在要在内存中截断出step_0和step_1前期自动运行出的地图出来即可。
下面图中第一个框表示制作的是7*7的地图。(结合我们前面粗略看得step逻辑也可以判断出来出入7是一边界,我们的v7也是49个元素的数组)

这里积累第三个经验:
第二个框表示送入v5作为最终地图,值得注意的是这个v5是int型的,v5也是数组,但是我们查看内存时是以1byte为单位的,所以我们要转成4bytes来看内存才行。

在这里插入图片描述
.
.
第一种方法:
IDA直接调试,在step_2处下断点,查看v5,转4bytes,取49个单位77排列。下面三个框描述的都是一样的数据,记住要转32位int型,即dd类型!按77排列即可,可以看出第一排是1001111,后面继续往下看。
(这里用右键菜单data format调成4bytes和signed即可用±1简化显示。这里有个坑,我现在选择的是8列一行,但是如果选择auto自动或4列一行的话就会出错,好像是隐藏了一些列,然后导致整个地图就画错了,这里注意一下。)
在这里插入图片描述

总的地图就是:(借别人的图)
在这里插入图片描述

那么每一步走到1上面就是:

ssddwdwdddssaasasaaassddddwdds

.
.

第二种方法GDB动态调试,首先看汇编代码,v5给了eax寄存器,那么有确定的内存位置就可以直接打印内存了,如果不知道v5放在哪里的话是没办法打印内存的。这里v5给了rax和rdi,所以两个都可以查。
在这里插入图片描述

根据上图的汇编地址,断点断在564793D24AB0即可:(这是别人的图,我自己找不到断掉,知道用./80dw命令显示rax寄存器即可,w是双字,d是整数打印。)
在这里插入图片描述
.
.
.
总结:

1: 这里积累第一个经验:一进去看到一堆变量,三个自定义函数,跟踪进step_0看看代码。
发现对v7有超过[7]下标的操作,怀疑主函数中一堆变量是v7的数组分出来的,看了一下堆栈,发现是连续的,于是调整主函数栈中局部变量构造。

2:
这里积累第二个经验:一开始受前面一道EASYHOOK题目的影响,我以为这里会有类似的虚实代码替换。跟踪进去后发现step_1不断嵌套而且没有系统函数替换进程地址,判断不是HOOK。但是由于step_1函数不断的嵌套,而且是那种循环算法的嵌套,我又以为是Newbie_calculations这类有冗余代码代码需要自己简化函数的题目,结果发现也是错的,因为Newbie_calculations的冗余代码作用是消耗时间,而这题也没有消耗时间。
最后查了资料我才明白,这种step_0和step_1代码的确是算法,但是它们在用户输入命令之前,也就是说这些是系统自执行代码,是为程序渲染环境做前期准备用的,没有必要弄懂它。比如这里step_0和step_1是为程序做迷宫地图的,设计迷宫算法,弄懂它与解题没有太大关系,而且前期准备环境的算法函数也不会有故意出错的地方来设考点,毕竟考点是走迷宫。

3:
这里积累第三个经验:
第二个框表示送入v5作为最终地图,值得注意的是这个v5是int型的,v5也是数组,但是我们查看内存时是以1byte为单位的,所以我们要转成4bytes来看内存才行。
第一种方法:
IDA直接调试,在step_2处下断点,查看v5,转4bytes,取49个单位77排列。下面三个框描述的都是一样的数据,记住要转32位int型,即dd类型!按77排列即可,可以看出第一排是1001111,后面继续往下看。
(这里用右键菜单data format调成4bytes和signed即可用±1简化显示。这里有个坑,我现在选择的是8列一行,但是如果选择auto自动或4列一行的话就会出错,好像是隐藏了一些列,然后导致整个地图就画错了,这里注意一下。)

解毕!敬礼!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值