攻防世界逆向WP,easy_Maze

迷宫问题参考:https://ctf-wiki.github.io/ctf-wiki/reverse/maze/maze/

 

下载下来后发现是64位ELF文件,没有加壳。由文件名easy_Maze知道这是一个迷宫问题,我们需要求出迷宫所存数组,以及在迷宫中行走对应的输入。拖入IDA,查找字符串交叉应用找到主函数,F5反编译发现主界面定义了51个连续变量,猜想这些变量极有可能就是迷宫的构成要素。除去变量,函数操作如下:

攻防世界逆向WP,easy_Maze_第1张图片

可以看到这里有三个函数,Step_0,Step_1,Step_2,应该就是对已有数据的操作了。变量中v9已知;v7,maze未知,所以猜测Step_0函数负责将v9的值经过变换传递给v7,Step_1负责将v7的值变化传递给maze,最终由在Step_2处传入maze数组。

 

进入Step_2函数,代码主体部分如下:

攻防世界逆向WP,easy_Maze_第2张图片

从数组(*a1)[7*i+j]的表示中可以看出,数组的行数为7。(7*7 的二维数组)

由while循环看出,输入最长不能超过30,且必须是”w”,”a”,”d”,”s”。

输入”w”,i--;输入”s”,i++;

输入”a”,j--;输入”d”,j++;

可以看出迷宫从左上角出发。

攻防世界逆向WP,easy_Maze_第3张图片

从最后的判断条件i==6,j==6可以看出,最终移动目标是右下角。、

这样就分析清楚了我们的输入与行走方向的对应关系。之后我们知道迷宫究竟是怎么样的。这由Step_0和Step_1函数决定。

 

我们可以继续对他们两个函数进行静态分析,写出他们的功能,求出迷宫表达式。但是因为我们是从Step_2函数的位置才开始输入的,Step_1的输出结果与我们的输入无关,是一个固定不变的值,所以我们可以用gdb进行动态分析,让他直接运行到Step_2函数处,然后直接查看maze的代码。具体操作如下:

输入命令:info functions Step,返回所有名称带有Step的函数:

攻防世界逆向WP,easy_Maze_第4张图片

我们给Step_2函数下一个断点:b Step_2

输入命令:r运行至Step函数开始位置。函数刚开始运行时,会为我们的输入分配内存空间。因为是x64系统,所以函数传递参数时会先通过寄存器传参。下图框起来的部分就是将函数参数存储到栈中的过程:

攻防世界逆向WP,easy_Maze_第5张图片

输入命令:print $寄存器。将输入的参数打印出来,rdi所存的参数就是maze数组的起始地址。

输入命令:x/80dw $1,将该片内存空间的数据打印出来,取前49个数据,这便是maze数组的元素:

攻防世界逆向WP,easy_Maze_第6张图片

将它们排列成7*7的矩阵,我们需要沿着1的路径从左上角走到右下角

攻防世界逆向WP,easy_Maze_第7张图片

路径为:ssddwdwdddssaasasaaassddddwdds。

 

你可能感兴趣的:(CTF)