• 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
  • 相关阅读:
    Android学习笔记_27_多媒体之视频刻录
    Android学习笔记_26_多媒体之拍照
    Android学习笔记_25_多媒体之在线播放器
    Android学习笔记_24_多媒体MediaPlayer对象之音乐播放器与SoundPool声音池
    多线程下载
    Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数
    MySQL 面试必备:又一神器“锁”,不会的在面试都挂了
    当 Redis 发生高延迟时,到底发生了什么
    Spring MVC 到 Spring BOOT 的简化之路
    MySQL的可重复读级别能解决幻读问题吗?
  • 原文地址:https://www.cnblogs.com/XXX-Echoed/p/13526920.html
Copyright © 2020-2023  润新知