极客大挑战逆向分析——maze

把文件加载入ida
在这里插入图片描述
一开始在右边找不到主函数。
于是去字符串里面找,F12+shift打开字符串面板
在这里插入图片描述
发现有蹊跷,点进去看看。
在这里插入图片描述有一个s,有一个E其他都是o和_,估计就是迷宫题了,接着就差寻找代码段了。
在这里插入图片描述复制一下上面的‘Ur not on the way!!’搜索所有出现该句的地方。在这里插入图片描述

结果发现一个test段,点进去F5反编译就是代码段了。

int sub_401A10()
{
  int v0; // ecx
  int v1; // eax
  int v2; // esi
  char *v3; // ecx
  unsigned int v4; // kr00_4
  int v5; // eax
  char v6; // cl
  char v8[108]; // [esp+8h] [ebp-70h]
  char v9[10
maze逆向是一种常见的逆向工程类型,相关方法、技术及案例如下: ### 方法和技术 - **寻找地图**:在maze逆向题中,往往需要找到“地图”,这是解决问题的基础。不过有时候地图不会直接呈现,需要深入分析才能发现[^1]。 - **分析函数逻辑**:由于代码里可能存在函数嵌套以及复杂的返回逻辑,所以要仔细分析函数之间的调用关系和返回值,从而理解程序的整体运行流程。比如一些迷宫逆向题中函数套函数,return逻辑复杂,需要耐心梳理[^1]。 - **使用IDC内置脚本**:在某些情况下,可在if语句处编写IDC内置脚本辅助分析。例如在BUGKU的Take the maze题中,就需要编写IDC内置脚本来解决问题[^1]。 - **分析输入与移动逻辑**:分析程序对输入的处理以及如何根据输入进行移动。像攻防世界逆向新手区《maze》,当输入的字符ASCII码值为79、111、46、48(即输入&rsquo;O&rsquo; ‘o&rsquo; ‘.&rsquo; ‘0&rsquo;)时,程序会分别执行左、右、上、下的移动操作[^4]。 - **判断结果逻辑分析**:关注程序中判断结果的部分,比如查看输出错误提示的位置,分析其判断条件。在攻防世界逆向新手区《maze》中,LABEL_22输出"Wrong flag!",说明LABEL_15与判断最终结果有关,通过分析判断条件能找到疑似迷宫的字符串[^4]。 ### 相关案例 - **BUGKU (Take the maze)**:做这道题时,一开始难以找到“地图”,函数嵌套和return逻辑复杂。最后通过编写IDC内置脚本解决问题,这是一个运用脚本辅助分析的典型案例[^1]。 - **攻防世界逆向新手区《maze》**:该题通过分析输入字符的ASCII码值确定移动逻辑,根据输出错误提示的位置分析判断结果逻辑,进而找到疑似迷宫的字符串,是分析输入与结果判断逻辑的典型案例[^4]。 ### 代码示例 以下是一个使用深度优先搜索(DFS)解决迷宫问题的示例代码: ```cpp #include <iostream> using namespace std; int maze[] = []//自己复制一下 int map[99][99]; char t[10000]; int r = 0; int dx[4] = { -1, 0, 1, 0 }; int dy[4] = { 0, 1, 0, -1 }; char op[4] = { 'w', 'd', 's', 'a' }; bool check(int qx, int qy) { if (qx >= 0 && qx < 99 && qy >= 0 && qy < 99) { if (map[qx][qy] == 0) return 1; } return 0; } void dfs(int x, int y) { if (x == 97 && y == 97) { for (int i = 0; i < r; i++) cout << t[i]; cout << endl; return; } for (int i = 0; i < 4; i++) { int qx = dx[i] + x; int qy = dy[i] + y; if (check(qx, qy)) { t[r] = op[i]; r++; map[x][y] = 1; dfs(qx, qy); map[x][y] = 0; r--; t[r] = 0; } } } int main() { for (int i = 0; i < 99; i++) { for (int j = 0; j < 99; j++) { map[i][j] = maze[99 * i + j]; } } dfs(1, 1); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值