首页
社区
课程
招聘
[原创][CTF] 一道简单的MAZE
发表于: 2020-5-6 15:21 4937

[原创][CTF] 一道简单的MAZE

2020-5-6 15:21
4937

这道题对于新手还是不错.

由题目我们能知道是关于迷宫的题. 下载下来是elf文件, 查壳后无壳, 在linux下运行看看大概流程.

载入IDA, 先分析了接受我们输入的字符的函数. 知道在外面一层的主函数是先生成一个每行7个元素的数组. 然后通过我们输入的字符按控制在矩阵迷宫中走向, 最后按照规定的到达一个目的地.

这个时候, 开始我就把生成矩阵的所有函数及数据都复制到VC 编译器中, 再根据栈的特点改下数据的顺序(数据存放是从下往上, 那么我们取数据时地址每次减1而不是加一), 然后运行打印出矩阵. 问题是运行后什么也没有打印, 调试发现一个函数中的内存空间和另外一个冲突, 相互覆盖值. 这个函数太多,关联性大, 改起来也麻烦.

然后转向GDB调试, 但是不熟练. 又转向ida动态调试. 首先在 IDA 的安装目录/dbgsrc/找到 linux_server 和 linux_server64 拷贝到 linux ,在linux中运行 linux_server64, 然后在Debugger的 process options 如下图格式配置. 然后F9开始.

先下断点, 找到储存矩阵的空间的地址, 把这个地址转到数据窗口跟随, 然后运行到生成矩阵的下面一个函数(也就是(Step_1下面). 在数据窗口出现我们的数据(int型), 由于是49个元素, 49*4/16 = 12 ...4 ,那就是12行加4个数据, 用 shift+E 提取出C语言格式的数据.

根据我们打游戏的熟悉 aswd ,朝着1走到最后. ssddwdwdddsssaasasaaassddddwdds 最后在linux下输入.

#include <stdio.h>

int main(void)
{
    union     //每个数据4个字节, 且小端. 用联合
    {
        unsigned char ida_chars[196];
        int a[49];
    }A = {
            1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            0,   0,   1,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   1,   0,   0,   0,   1,   0, 
            0,   0,   0,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            0,   0,   1,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   1,   0,   0,   0,   0,   0, 
            0,   0,   1,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            0,   0,   0,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            0,   0,   1,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   1,   0,   0,   0,   0,   0, 
            0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
            0,   0,   0,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   1,   0,   0,   0,   1,   0, 
            0,   0,   1,   0,   0,   0,   1,   0,   0,   0, 
            1,   0,   0,   0,   1,   0,   0,   0,   0,   0, 
            0,   0,   1,   0,   0,   0
        };
    int i = 0, j = 0;
    int (*p)[7] = (int (*)[7])A.a;  // 强制转化为数组指针, 方便后面打印

    for(i = 0; i < 7; i++)
    {
        for(j = 0; j < 7; j++)
        {
            printf("%d ", p[i][j]);
        } 
        putchar(10);
    }

    return 0;

}

easy_Maze

  • 这道题对于新手还是不错.

  • 由题目我们能知道是关于迷宫的题. 下载下来是elf文件, 查壳后无壳, 在linux下运行看看大概流程.

  • 载入IDA, 先分析了接受我们输入的字符的函数. 知道在外面一层的主函数是先生成一个每行7个元素的数组. 然后通过我们输入的字符按控制在矩阵迷宫中走向, 最后按照规定的到达一个目的地.

  • 接下来返回外侧的主函数, 就是生成矩阵的了. 通过上面的49个元素知道且下面函数的参数7, 知道规模 7*7.
  • 进入Step_0 看看. 就是简单的把上面49个元素赋值给 v7 数组, 也印证了数组是7*7
  • 接下来 Step_1, 看起来是很简洁, 但里面的 getAgetAstart 函数 算法太冗长了.
  • 这个时候, 开始我就把生成矩阵的所有函数及数据都复制到VC 编译器中, 再根据栈的特点改下数据的顺序(数据存放是从下往上, 那么我们取数据时地址每次减1而不是加一), 然后运行打印出矩阵. 问题是运行后什么也没有打印, 调试发现一个函数中的内存空间和另外一个冲突, 相互覆盖值. 这个函数太多,关联性大, 改起来也麻烦.

  • 然后转向GDB调试, 但是不熟练. 又转向ida动态调试. 首先在 IDA 的安装目录/dbgsrc/找到 linux_server 和 linux_server64 拷贝到 linux ,在linux中运行 linux_server64, 然后在Debugger的 process options 如下图格式配置. 然后F9开始.

  • 先下断点, 找到储存矩阵的空间的地址, 把这个地址转到数据窗口跟随, 然后运行到生成矩阵的下面一个函数(也就是(Step_1下面). 在数据窗口出现我们的数据(int型), 由于是49个元素, 49*4/16 = 12 ...4 ,那就是12行加4个数据, 用 shift+E 提取出C语言格式的数据.

  • 数据得到后, 用C语言打印出来好观察, 注意每个数据4个字节(小端).

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-7-27 19:09 被BIX编辑 ,原因: 上传了附件, 增加了些细节操作, 比如动态调式等...
上传的附件:
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
能否将题目以附件形式上传一下?
另外,再起个表达文章中心的标题,内容再详细些,可以得到优秀或精华。
2020-5-6 17:41
1
雪    币: 344
活跃值: (922)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
BIX
3
都做了哈
2020-5-6 20:54
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
mb_owiixzkb 都做了哈
恭喜转为正式会员!
2020-5-7 15:56
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2020-5-7 19:23
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2020-5-9 10:22
0
雪    币: 2677
活跃值: (5340)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
7
hgame的题2333
2020-5-9 20:52
0
游客
登录 | 注册 方可回帖
返回
//