zoukankan      html  css  js  c++  java
  • RE之攻防世界 maze

    这个是我看到的写的最全的WP

    maze 迷宫问题,先看一下wiki了解一下

    迷宫问题具有以下特征:
    • 在内存中放置一个“地图”
    • 将用户输入限制为几个字符。
    • 通常只有一个迷宫入口和一个迷宫出口
    放置的地图可以由可显示的字符(例如#和*)组成(这非常明显,字符串的基本视图知道这是一个迷宫。),还可以使用不可见的十六进制值来表示。该地图可以直接组成非常长的字符串,也可以一一排列。如果是逐行排列,由于迷宫一般较大,所以用于按线(注意,不按排列)按顺序排列,每行对应一个特定的行号,需要确定该行还原迷宫图的编号。

    第一步,还是查壳 ,知道是64位的啦

    第二步,拖入IDA64
    找到main函数

    
     v4 = 5LL;
     if ( strlen(&s1) - 1 > 5 )
     {
       while ( 1 )
       {
         v5 = *(&s1 + v4);
         v6 = 0;
         if ( v5 > 78 )
         {
           v5 = (unsigned __int8)v5;
           if ( (unsigned __int8)v5 == 79 )
           {
             v7 = sub_400650((char *)&v10 + 4, v3);
             goto LABEL_14;
           }
           if ( v5 == 111 )
           {
             v7 = sub_400660((char *)&v10 + 4, v3);
             goto LABEL_14;
           }
         }
         else
         {
           v5 = (unsigned __int8)v5;
           if ( (unsigned __int8)v5 == 46 )
           {
             v7 = sub_400670(&v10, v3);
             goto LABEL_14;
           }
           if ( v5 == 48 )
           {
             v7 = sub_400680(&v10, v3);
    LABEL_14:
             v6 = v7;
             goto LABEL_15;
           }
         }
    LABEL_15:
         v3 = (const char *)HIDWORD(v10);
         if ( !(unsigned __int8)sub_400690(asc_601060, HIDWORD(v10), (unsigned int)v10) )
           goto LABEL_22;
         if ( ++v4 >= strlen(&s1) - 1 )
         {
           if ( v6 )
             break;
    LABEL_20:
           v8 = "Wrong flag!";
           goto LABEL_21;
         }
       }
     }
     if ( asc_601060[8 * (signed int)v10 + SHIDWORD(v10)] != 35 )
       goto LABEL_20;
     v8 = "Congratulations!";
    LABEL_21:
     puts(v8);
     return 0LL;
    }
    

    首先一上来我们能知道
    if ( strlen(&s1) != 24 || (v3 = "nctf{", strncmp(&s1, "nctf{", 5uLL)) || *(&byte_6010BF + 24) != '}' )
    也就是flag长度为24 ,且以nctf{ 开头,以}结尾
    再看下面可以分成四个部分(把if语句中的数字都变成字符,也就是选中摁R)

    这里其实就是控制上下左右的函数,可以发现分别是Oo.0
    400650对应O

    400660对应o

    400670对应.
    和400650相同

    400680对应0
    和400660相同

    打开汇编看一下这里的V9和V9+1到底指代的是啥

    r14,也就是V9是Y轴,r15,也就是V9+1是X轴
    经过分析得出

    O => x-=1 左移
    . => y-=1 上移
    o => x+=1 右移
    0 => y+=1 下移
    

    再往下看解开函数的关键来了
    查看asc_601060得到
    asc_601060 db ' ******* * **** * **** * *** *# *** *** *** *********',0
    又根据上面的8乘多少多少猜测迷宫为8个一行,则依次排列下来就是这样

    结果是右下右右下下左下下下右右右右上上左左,正好18位
    nctf{o0oo00O000oooo..OO}

    你做的每件事都值得。 ——yaerda
  • 相关阅读:
    【原创】主机不能访问虚拟机CentOS7中的站点
    phpStudy中MySQL版本升级到5.7.17方法
    phpStudy for Linux (lnmp+lamp一键安装包)
    Linux的wget命令详解【转载】
    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change
    电赛菜鸟营培训(二)——STM32F103CB之中断控制
    电赛菜鸟营培训(零)——Keil环境搭建
    电赛菜鸟营培训(一)——STM32F103CB之LED控制
    AppInventor学习笔记(四)——打地鼠应用学习
  • 原文地址:https://www.cnblogs.com/XXX-Echoed/p/13526920.html
Copyright © 2011-2022 走看看