maze迷宫

 maze

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  __int64 v3; // rbx
  int v4; // eax
  char v5; // bp
  char v6; // al
  const char *v7; // rdi
  unsigned int v9; // [rsp+0h] [rbp-28h] BYREF
  int v10[9]; // [rsp+4h] [rbp-24h] BYREF

  v10[0] = 0;
  v9 = 0;
  puts("Input flag:");
  scanf("%s", &input);
  if ( strlen(&input) != 24 || strncmp(&input, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 )// 长度24,前5,,nctf{后1,,}
  {
wrong_:
    puts("Wrong flag!");
    exit(-1);
  }
  v3 = 5LL;
  if ( strlen(&input) - 1 > 5 )
  {
    while ( 1 )
    {
      v4 = *(&input + v3);
      v5 = 0;
      if ( v4 > 78 )                            // v4大于78一组,控制v10
      {
        if ( v4 == 'O' )
        {
          v6 = sub_400650(v10);
          goto LABEL_14;
        }
        if ( v4 == 'o' )
        {
          v6 = sub_400660(v10);
          goto LABEL_14;
        }
      }
      else                                      // v4小于78一组,控制v9
      {
        if ( v4 == '.' )
        {
          v6 = sub_400670(&v9);
          goto LABEL_14;
        }
        if ( v4 == '0' )
        {
          v6 = sub_400680(&v9);
LABEL_14:
          v5 = v6;
          goto LABEL_15;
        }
      }
LABEL_15:
      if ( !sub_400690(maze, v10[0], v9) )
        goto wrong_;
      if ( ++v3 >= strlen(&input) - 1 )
      {
        if ( v5 )
          break;
wrong:
        v7 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( maze[8 * v9 + v10[0]] != 35 )            // #出口
    goto wrong;
  v7 = "Congratulations!";
LABEL_21:
  puts(v7);
  return 0LL;
}

其中

 从此函数判断v9,v10的意义

v9要乘8,推断一行有8个元素,v9变化1,乘8后上下移动一行

所以v10控制左右移动,v9控制上下移动

再进入4个if中的函数判断,知O--向左,o--向右,.--向上,0--向下

每次输入后也要在次函数判断走到‘ ’(32)或‘#’(35)都对

搞清如何移动后,脚本变一下迷宫格式,

OOXXXXXX                右下
XOOOXOOX               右右下
XXXOXOXX                下
XXOOXOXX                左下
XOOX#OOX                下                            左左
XXOXXXOX                下                            上
XXOOOOOX                右右右右                上
XXXXXXXX

十八次操作换成指定字符

o0oo00O000oooo..OO

加上前后nctf{}正好24个

easy_Maze

main函数

v7数组下面出现连续且类型相同的变量v8v9.....储存的内容也像是有些联系,猜测ida分析出错,数组v7的长度给小了,下面也应该是属于v7数组,改为v7[49],,,我为什么这样推测,因为‘Newbie_calculations’改过一次

 查下字符串

 定位到该字符串,它在(main)--->(Step_2)--->(output)中,浅看一下output

 猜测这长条啥函数应该是输出,

for上面输出flag开头格式

for里面循环遍历数组-------v6存储flag内容应该是输入的方向,v8为flag位数

for下面输出flag结尾格式

到上一层output附近,可以看出如果满足条件就祝贺并output  flag

错误就输出叫你再逝一次

已知目的地后从main开始分析

发现不复杂,除了赋值,主要的就是这三个函数

前两个有点像,都是从第一个参数的值按某种逻辑赋值给第三个参数

v7->v6->v5,,最后v5到step2中判断,v5很可能就是迷宫地图

前两个函数制造地图

现在来仔细查看

只是简单赋值,没有输入,没必要完全看明白,剩下的交给动态 

1.ida动态

2.jdb动态

我这里用的jdb,ida没调好,,其实jdb第一次用,亏有真珠格格相助,

 首先在step_2处下断点,因为此位置是step_0,step_1执行完,要向step_2中传参(v5)

在此可以在寄存器中找到参数v5

 查看寄存器的值,那么那个寄存器里是v5的地址呢

看一下step_2上面的汇编

 var_270就是v5,lea把v5地址传入rax,mov再把rax的值赋值给rdi

所以rdi中是v5的地址:0x7fffffffdc30

得到v5地址后可以根据地址查值

 以0x7fffffffdc30为首地址,向后查49位

1000001010101010001010000010101010001010100000001

不太对,不知道为啥,等有条件了在试一下

在这里插入图片描述

搞出迷宫地图后,研究一下step_2,找一下移动控制键,见到数字就转字符

这个循环条件可以看出,改变v10控制上下移动,改变v9控制左右移动,‘1’是路径 

上面分析过output函数,v6存储flag内容应该是输入的方向,v8为flag位数,所以移动次数要小于等于29

 LABEL_14作用,提示输入非法字符

怎么进入if里面,v10==6说明向下6行,v9==6向右六列,说明终点在右下角

 搞明白了,玩就完了

ssddwdwdddssaasasaaassddddwdds

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值