zoukankan      html  css  js  c++  java
  • 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
    :");//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("
    ok, 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
    :");//v5+1
    分析这里,我们能知道,'up'->v4-1,'down'->v4+1,'left'->v5-1,'right'->v5+1
    这里就是相当于,v4和v5表示的是位置初始值,一开始都是0,也就相当于在'*'处,然后我们要变化v4、v5的值,也就是通过移动位置,走到'#'号处。
    那么这里结果就出来啦,答案就为222441144222,走出迷宫!!!
  • 相关阅读:
    Python学习笔记(6)-异常
    Python学习笔记(1)-基本概念
    自动化测试工具Sikuli的安装以及应用
    SoapUI添加断言
    SoapUI接口之间的数据传递
    Fitnesse初体验
    SoapUI5.1.2命令行执行https类型接口集成
    SoapUI命令行执行测试用例
    Jenkins集成AirTest不启动浏览器
    AirTest执行时不能输入汉字
  • 原文地址:https://www.cnblogs.com/jane315/p/12907760.html
Copyright © 2011-2022 走看看