[CTF] 一道迷宫题, ida中动态调试到应用及数组指针的理解.
2020-05-07 21:19:27 Author: bbs.pediy.com(查看原文) 阅读量:272 收藏

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个元素, 494/16 = 12 ...4 ,那就是12行加4个数据, 用 *shift+E 提取出C语言格式的数据.

  • 数据得到后, 用C语言打印出来好观察, 注意每个数据4个字节(小端).
#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;

}

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

  • 总结: 更加熟悉了linux动态调试的运用, 加深了数组指针的理解.


[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!

最后于 23小时前 被mb_owiixzkb编辑 ,原因: 上传了附件, 增加了些细节操作, 比如动态调式等...


文章来源: https://bbs.pediy.com/thread-259342.htm
如有侵权请联系:admin#unsafe.sh