• BUUOJ reverse 不一样的flag


    不一样的flag

    是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 flag 请包上 flag{} 提交

    ida看伪C代码:

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      char v3; // [esp+17h] [ebp-35h]
      int v4; // [esp+30h] [ebp-1Ch]
      int v5; // [esp+34h] [ebp-18h]
      signed int v6; // [esp+38h] [ebp-14h]
      int i; // [esp+3Ch] [ebp-10h]
      int v8; // [esp+40h] [ebp-Ch]
    
      __main();
      v4 = 0;
      v5 = 0;
      qmemcpy(&v3, _data_start__, 0x19u);
      while ( 1 )
      {
        puts("you can choose one action to execute");
        puts("1 up");
        puts("2 down");
        puts("3 left");
        printf("4 right
    :");
        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 )
          exit(1);
        if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
        {
          puts("
    ok, the order you enter is the flag!");
          exit(0);
        }
      }
    }

    可以看到每次都将用户的输入存到v6里面,然后根据v6的值来调整v4和v5的值,输入1就让v4--   2就让v4++  3就让v5--   4就让v5++

    下面这一段代码说明v4 和v5取值都必须在0~4之间:

        for ( i = 0; i <= 1; ++i )
        {
          if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
            exit(1);
        }

    关键在于这一段代码:

        if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )
          exit(1);
        if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
        {

    我们仔细看主函数的代码,发现v8是一直没有动过的,再仔细算一下  &v8 + 5 * v4 + v5 - 41 这个偏移量是 &v8-41 到&v8-17之间,也就是完全落在v3的25个值里面!

    他的逻辑是 如果算出来&v8 + 5 * v4 + v5 - 41 这个偏移量对应的值如果是1就退出,否则继续,直到找到“#”这个值

    所以这个题本质上是个走迷宫.........

    纯手走的 答案是:222441144222

  • 相关阅读:
    5.3Python解析动态页面源代码
    5.2
    5.1selenium
    团队项目第一阶段冲刺第十天
    团队项目第一阶段冲刺第九天
    4.30线程和进程
    团队项目第一阶段冲刺第八天
    Mac下全局安装yarn,报错,没有访问权限解决办法
    Mac下的常用命令行
    I Term2常用快捷键
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/11421648.html
Copyright © 2020-2023  润新知