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的值又不知道,因此,陷入了僵局。

后來想着,看看有什么奇怪的字符串,然后發現了這個!

 

 

看見那個*11110100001010000101111#,我一度以為這個就是答案,哈哈哈,想的太好了,怎么可能!然后,又不知道怎么弄了,於是我看了下大佬們寫的writeup ,才知道這題是個走迷宮的逆向題,那段字符串,就是走出迷宮的地圖。*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49,*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35,中,49對應的Ascii值恰好是'1',35對應的ascii值恰好是'#',根據算法的大意,我們就能知道,若最后結果等於'1',那么程序會退出,字最后結果等於'#',那么相應的我們就得到了我們flag的對應數字順序.也就是說,我們迷宮的終點是'#',而在這過程中,我們要避開'1',就這樣走到我們的終點。

把*11110100001010000101111#按5X5的順序擺好,如下(為什么5X5呢,我也不知道,可能是因為正好可以被5整除,這點,等我以后知道了,我再來補充把!)

* 1 1 1 1

0 1 0 0 0

0 1 0 1 0

0 0 0 1 0

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,也就相當於在'*'處,然后我們要變化v4、v5的值,也就是通過移動位置,走到'#'號處。
那么這里結果就出來啦,答案就為222441144222,走出迷宮!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM