当前位置: 代码迷 >> 综合 >> 攻防世界,Reverse:maze(未完善)
  详细解决方案

攻防世界,Reverse:maze(未完善)

热度:78   发布时间:2023-12-05 19:07:50.0

1.解题过程:

 由于是迷宫题,分为两个部分:

①迷宫图

②迷宫规则

 首先查找字符串发现一串符号,推测是迷宫图,但不知道怎么排列

接着f5反编译得到代码,应该就是迷宫的规则,所以开始分析代码(下面三张图的注释) 

 接着我们要分析四个 if 语句中的四个函数

注意:二维数组在存储时是按行排列的,四个函数都是bool返回False或者True

1)函数 sub_400650 

作用:v9的下一个字节 -1 对应 将 v9 对应的位置向移一个位置,并将此位置v5赋予对应的符号

2)函数 sub_400660 

作用:v9的下一个字节 +1 对应 将 v9 对应的位置向移一个位置,并将此位置v5赋予对应的符号

3)函数 sub_400670 

作用:v9 -1 对应 将 v9 对应的位置向移一个位置,并将此位置v5赋予对应的符号

4)函数 sub_400680 

作用:v9 +1 对应 将 v9 对应的位置向移一个位置,并将此位置v5赋予对应的符号

5)字符串 asc_601060

存放的迷宫

6)接下来看到这一段,对应调用函数,实参传形参

传入函数 sub_400690  

对应我们可以知道 a1 就是迷宫字符串,而 a2 对应的是 v9 的下一个位置(详细请看知识点)

a3 对应的是 v9

 

 

通过四个函数可以看到上下左右移动的范围都是 0-8 ,所以这个迷宫为 8x8 的迷宫

在 VScode 下可以进行对齐 ,使用 0 替代空格填充,方便查看

 注意:LL为 long long 类型的后缀

最后按照上 ’.‘ 下 ’0‘ 左 ’O‘ 右’o‘ 走迷宫

下下右右下下左下下下右右右右上上左

注意最后一个还是左,因为最后一步为 #,而程序最后判断是否为 #

所以flag就是

nctf{o0oo00O000oooo…OO}

2.知识点:

(1).pyc文件是二进制文件,而.py文件是python语言直接产生的文件,就像c语言对应的.c文件,c++对应的.cpp文件,.pyc文件是由原来的python编译后产生的,所以可以使用反编译进行处理得到.py源文件

(2)其中涉及的 c 库函数:

         strlen

         strncmp()

         chr(97)        返回值 a

             可以返回对应整数的ASCII码值

(3)涉及到的IDA中的宏定义:(下面的 DWORD 代表 unsigned long)

         #define HIDWORD(x)   

             对应   (*((_DWORD*)&(x)+1))

         #define SHIDWORD(x)   

             对应   (*((int32*)&(x)+1))    

         #define LOBYTE(x) (*((_BYTE*)&(x)))   

             对应   low byte    低位

注意:指针 + 整型数 结构:

           如:char *p="1234567890";

                  则 p+3 指向 4

                  char *p="abcdefghijklmn";

                  则 p+3 指向 d

         IDA常见宏定义_bluestar628的博客-CSDN博客_ida宏定义

(4)两个静态内存分配

         ①.bss段:指存放程序中初始化的全局变量的一块内存区域

         ②.date段:指存放程序中初始化的全局变量的一块内存区域

(5)本题IDA中的涉及的假名字:

         sub_        子函数

         asc_         ASCII字符串

         IDA调试技巧(妥妥的干货分享) - 简书 (jianshu.com)

  相关解决方案