[HDCTF2019]Maze

分析文件

32位,有壳upx

脱壳

使用吾爱破解工具箱里面的upx脱壳机,拖入进去会自动脱壳

ida32打开

明显的花指令特征

尝试修改call指令,改成nop,右击call指令->patching->change byte

可以看到E8 58 C7 45 EC 00 00 00 00 EB 09 8B 4D EC 83 C1

将其开头的E8改成90

选中红色地址区域,按p键即可看到main函数,然后按f5查看伪代码

分析main函数

scanf("%14s", v5); //输入数据到v5
for ( i = 0; i <= 13; ++i )
  {
    switch ( v5[i] )
    {
      case 'a':
        --*asc_408078;
        break;
      case 'd':
        ++*asc_408078;
        break;
      case 's':
        --dword_40807C;
        break;
      case 'w':
        ++dword_40807C;
        break;
      default:
        continue;
    }
  }
//遍历v5中的每一个值,并且分别与a,d,s,w进行比较,同时对asc_408078和dword_40807C变量进行加减操作
 if ( *asc_408078 == 5 && dword_40807C == -4 )
  {
    sub_401140(aCongratulation);   //表示输入正确
    sub_401140(aHereIsTheFlagF);
  }
  else
  {
    sub_401140(aTryAgain);
  }

//最终asc_408078变量要等于5,dword_40807C要等于-4

通过上面分析,a,d,s,w几个关键字母可以猜出是走迷宫的题目,并且查看汇编代码可以看到asc_408078,和dword_40807C的值 (7和0),大概就是初始坐标

猜测迷宫图是由*******+********* ****** **** ******* **F****** **************这些字符组成

这些字符长度是70,初始坐标是(7,0),迷宫图只有两种可能排列,一种是7*10,另一种是10*7

7*10的是这样

*******
+******
*** ***
***    
****   
*******
 **F***
***    
*******
*******

很明显不对,因为根本走不通

10*7的是这样

*******+**
******* **
****    **
**   *****
** **F****
**    ****
**********

嗯,这样看样子才对,分析了一下,应该是从+开始走,走到F,然后移动的方向分别表示w,a,s,d这几个字母

flag{ssaaasaassdddw}

### HDCTF2019 Maze 1 解题思路 #### 反汇编分析 在处理 `HDCTF2019` 的 `Maze 1` 题目时,遇到的主要挑战之一是在 IDA Pro 中进行反汇编的过程中遇到了花指令。这些花指令通过无意义的操作来混淆实际逻辑,增加了静态分析的难度[^1]。 #### 地图解析 题目提供了一张迷宫的地图,其中特定字符代表不同的地形特征。例如,“*”可能表示墙壁或不可通行区域,而“0”则标记了可走通的道路。“F”可能是终点标志。地图结构如下: ``` ******* ******* ****000* **000*** **0**F** **0000** ********* ``` 此布局有助于理解程序执行流的方向以及如何遍历到达目标位置[^2]。 #### 修改与调试技巧 为了简化问题并绕过某些保护机制,在IDA中可以通过NOP操作将关键分支条件替换为空操作,从而改变原有控制流程。对于该题目而言,就是把影响正常路径判断的关键字节序列修改成不会引起跳转变化的形式,比如将`jnz short near ptr loc_40102E+1`这样的语句变为简单的NOP指令[^3]。 ```assembly ; 原始代码片段 jnz short near ptr loc_40102E+1 ; 这里会根据ZF决定是否跳转至loc_40102E地址处继续执行 ; 修改后的版本 nop ; 替换成空操作符,使得无论如何都不会发生跳转行为 ``` 这种手法能够帮助逆向工程师更清晰地观察到隐藏于复杂表象下的真实算法逻辑,并最终找到通往flag的有效途径[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值