buuctf->不同的flag

下载附件后,就是一个可执行文件,经查壳后,没发现有壳!呃,先执行下可执行文件,结果以下:算法

 

乱按一通,发现直接闪退啦,拖到IDA(32bits)进行反编译分析,F5进入主函数,发现函数

while ( 1 )
  {
    puts("you can choose one action to execute");
    puts("1 up");        //v4-1
    puts("2 down");      //v4+1
    puts("3 left");      //v5-1
    printf("4 right\n:");//v5+1
    scanf("%d", &v6);
    if ( v6 == 2 )
    {
      ++v4;
    }
    else if ( v6 > 2 )
    {
      if ( v6 == 3 )
      {
        --v5;
      }
      else
      {
        if ( v6 != 4 )
LABEL_13:
          exit(1);
        ++v5;
      }
    }
    else
    {
      if ( v6 != 1 )
        goto LABEL_13;
      --v4;
    }
    for ( i = 0; i <= 1; ++i )
    {
      if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
        exit(1);
    }
    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )  #49->'1'
      exit(1);
    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )  #35->'#'
    {
      puts("\nok, the order you enter is the flag!");
      exit(0);
    }
  }

,因此咱们的flag相必就是咱们输入的数字组合啦!后来一直在逆向推算法,怎么走才能最终获得flag,但可能性太多,v8的值又不知道,所以,陷入了僵局。spa

后来想着,看看有什么奇怪的字符串,而后发现了这个!code

 

 

看见那个*11110100001010000101111#,我一度觉得这个就是答案,哈哈哈,想的太好了,怎么可能!而后,又不知道怎么弄了,因而我看了下大佬们写的writeup ,才知道这题是个走迷宫的逆向题,那段字符串,就是走出迷宫的地图。*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49,*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35,中,49对应的Ascii值刚好是'1',35对应的ascii值刚好是'#',根据算法的大意,咱们就能知道,若最后结果等于'1',那么程序会退出,字最后结果等于'#',那么相应的咱们就获得了咱们flag的对应数字顺序.也就是说,咱们迷宫的终点是'#',而在这过程当中,咱们要避开'1',就这样走到咱们的终点。blog

把*11110100001010000101111#按5X5的顺序摆好,以下(为何5X5呢,我也不知道,多是由于正好能够被5整除,这点,等我之后知道了,我再来补充把!)ci

* 1 1 1 1v8

0 1 0 0 0字符串

0 1 0 1 0it

0 0 0 1 0io

1 1 1 1 #

这里分析下走的原理(我看了半天,才反应过来怎么走的)

    puts("1 up"); //v4-1 puts("2 down"); //v4+1 puts("3 left"); //v5-1 printf("4 right\n:");//v5+1
分析这里,咱们能知道,'up'->v4-1,'down'->v4+1,'left'->v5-1,'right'->v5+1
这里就是至关于,v4和v5表示的是位置初始值,一开始都是0,也就至关于在'*'处,而后咱们要变化v四、v5的值,也就是经过移动位置,走到'#'号处。
那么这里结果就出来啦,答案就为222441144222,走出迷宫!!!
相关文章
相关标签/搜索