文章目录

  • 收集信息
  • 静态分析
    • shift + F12查看字符串窗口
    • F5查看伪代码
    • 来看重点
    • 画图获取flag

今天在云演平台上看reverse模块最后一节讲的是迷宫问题,觉得挺有意思。去攻防世界看了看,Reverse模块新手练习区的最后一题就是迷宫问题(maze),所以拿来练练手。

收集信息

将附件下载下来之后,用 Exeinfo PE 分析,可见不是exe可执行文件,而是ELF。且此文件是64位,加壳与否信息未知,我们用IDA Pro64位进行静态分析。

静态分析

shift + F12查看字符串窗口

首先查看字符串窗口,发现最底下一串字符是由 * ,# 以及空格组成的,不难猜测出这应该就是迷宫了。其次,Congratulations代表恭喜,这里面是不是有 flag 的信息呢?我们点进去看看。

F5查看伪代码


发现背后是 main 函数,F5查看伪代码

_int64 __fastcall main(int a1, char **a2, char **a3)
{__int64 v3; // rbxint v4; // eaxchar v5; // bpchar v6; // alconst char *v7; // rdiunsigned int v9; // [rsp+0h] [rbp-28h] BYREFint v10[9]; // [rsp+4h] [rbp-24h] BYREFv10[0] = 0;v9 = 0;puts("Input flag:");scanf("%s", &s1);if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 ){LABEL_22:puts("Wrong flag!");exit(-1);}v3 = 5LL;if ( strlen(&s1) - 1 > 5 ){while ( 1 ){v4 = *(&s1 + v3);v5 = 0;if ( v4 > 78 ){if ( (unsigned __int8)v4 == 79 ){v6 = sub_400650(v10);goto LABEL_14;}if ( (unsigned __int8)v4 == 111 ){v6 = sub_400660(v10);goto LABEL_14;}}else{if ( (unsigned __int8)v4 == 46 ){v6 = sub_400670(&v9);goto LABEL_14;}if ( (unsigned __int8)v4 == 48 ){v6 = sub_400680(&v9);
LABEL_14:v5 = v6;goto LABEL_15;}}
LABEL_15:if ( !(unsigned __int8)sub_400690(asc_601060, (unsigned int)v10[0], v9) )goto LABEL_22;if ( ++v3 >= strlen(&s1) - 1 ){if ( v5 )break;
LABEL_20:v7 = "Wrong flag!";goto LABEL_21;}}}if ( asc_601060[8 * v9 + v10[0]] != 35 )goto LABEL_20;v7 = "Congratulations!";
LABEL_21:puts(v7);return 0LL;
}

来看重点

 puts("Input flag:");scanf("%s", &s1);if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 ){LABEL_22:puts("Wrong flag!");exit(-1);}

我们输入的字符串为 s1,当此字符串的长度不为24或者 s1的开头五个字符不为 “ nctf{ ” 或者**最后一个字符不为 “ } ”**时(对照ascii码表,125对应字符 } ),跳转到 LABEL_22,并输出 Wrong flag! 这意味着,最终的 flag 的基本格式为 nctf{18个字符}

其次,循环中肉眼可见的四个判断语句

同样对照ascii码表,可得这几个字符分别为 :O、o、. 、0,不难猜测出这就是我们来控制上下左右走出迷宫的四个方向符了,来查看其对应的操作。

• sub_400650

bool __fastcall sub_400650(_DWORD *a1)
{int v1; // eaxv1 = (*a1)--;return v1 > 0;
}

• sub_400660

bool __fastcall sub_400660(int *a1)
{int v1; // eaxv1 = *a1 + 1;*a1 = v1;return v1 < 8;
}

之后的sub_400670和sub_400650一样,sub_400680和sub_400660,分别执行减一加一的操作,这也验证了我们的猜想是代表走迷宫的上下左右移动。但我们仍然不知道哪个代表 x 轴的移动,哪个代表 y 轴的移动。同时两个函数中还包含着一个关键性的信息,return v1 > 0;return v1 < 8;猜测是代表迷宫的大小为 8*8

所以究竟谁是 x 轴谁是 y 轴,还有起点在哪儿呢?继续观察上述代码,O和o对应的函数参数为 v10,而 . 和0对应的是 v9,回到参数定义的位置

unsigned int v9; // [rsp+0h] [rbp-28h] BYREF
int v10[9]; // [rsp+4h] [rbp-24h] BYREF

这边我没琢磨懂,看了亿眼别人的wp,发现他是这么说的:攻防世界 maze_别害怕我在的博客-CSDN博客_maze攻防世界

加4的就是 x 轴,不加4 的就是 y 轴。

…还是不太明白QAQ,不过个人感觉无非就是两种情况,都试一下问题应该也不大。同时回到main函数的汇编代码段,可见起点是(0,0)

画图获取flag

这样所有逻辑都理清了,即

flag 的基本格式为 nctf{18个字符}

地图是 8*8,将字符串分为此规格即可

O、o、. 、0 代表控制上下左右走出迷宫的四个方向符

O、o分别代表 x 轴左、右移动

. 、0分别代表 y 轴上、下移动

然后就是画图走迷宫了,可以手画也可以代码。这边量不大我就手画了

内容以及同步更新至 lbw的小窝

攻防世界Reverse-maze相关推荐

  1. 攻防世界 REVERSE 新手区/maze

    攻防世界 REVERSE 新手区/maze 老规矩先查壳,没加壳而且是64位的 用IDA64位打开,找到main函数F5查看伪代码 这是一个迷宫题,必然是有迷宫图在里面,然后走的路径就是输出的flag ...

  2. 攻防世界 Reverse高手进阶区 2分题 reverse-for-the-holy-grail-350

    前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是reverse-for-the-holy-grail-350的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数 ...

  3. 攻防世界reverse进阶easyre-153 writeup(#gdb调试父子进程、#ida版本差异)

    文章目录 学习目标: 引言 第一步.查脱壳 1.查壳 2.脱壳 3.查看文件格式 第二步.IDA静态分析 1.IDA版本的小坑 2.分析main函数 3.分析lol函数 第三步.gdb动态分析 1.m ...

  4. Revers篇:攻防世界reverse进阶re2-cpp-is-awesome

    攻防世界reverse进阶re2-cpp-is-awesome IDA分析 很简单的一个程序 程序流程分析 首先检查参数,参数少于2就退出,并提示:Usage: ./re2-cpp-is-awesom ...

  5. 攻防世界 Reverse高手进阶区 3分题 crackme

    前言 继续ctf的旅程 攻防世界Reverse高手进阶区的3分题 本篇是crackme的writeup 攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 查壳,显示nsPack壳 找了个 ...

  6. 攻防世界 REVERSE 新手区/game

    攻防世界 REVERSE 新手区/game 下载得到附件 看题目说一共有8个围成一圈的灯,需要输入1-8个数,输入的数会让相应的数字的灯改变状态(亮或灭),且该灯的前一个灯和后一个灯也会改变状态.输入 ...

  7. 攻防世界Reverse进阶区-EasyRE-writeup

    1. 介绍 本题是xctf攻防世界中Reverse的进阶区的题EasyRE. 下载下来以后是一个exe文件:210f1e18ac8d4a15904721a2383874f5.exe 2. 分析 首先看 ...

  8. 攻防世界Reverse进阶区-answer_to_everything-writeup

    本题是xctf攻防世界中Reverse的进阶区的题answer_to_everything 题目来源: 2019_ISCC 题目描述:sha1 得到了一个神秘的二进制文件.寻找文件中的flag,解锁宇 ...

  9. 攻防世界reverse高手进阶 ----- gametime

    gfsj ----- gametime 昨天做了一道攻防世界的题key和这个gametime,都是动态调试的题.key还稍微简单一些,gametime稍微费点时间,记录一下. 昨天晚上可能是没进入做题 ...

  10. 攻防世界Reverse第十二题maze

    放入Exenifo PE查看发现为无壳64位文件 放入64位IDA查看main函数 题目分析可得应该是一类走迷宫的题目 读取f1就是目标flag 后面的if是判断flag的形式是否正确(长度为24,最 ...

最新文章

  1. 二进制转ascii码python_python – 将二进制转换为ASCII,反之亦然
  2. 纪念机器翻译概念的诞生:重新认识瓦伦·韦弗先生
  3. 英国将迎来史上第二位女首相
  4. 解题报告-Leecode 563. 二叉树的坡度——Leecode每日一题系列
  5. 站酷用HTML5播放视频,站酷:动效展示实践的问题及解决
  6. 电信光猫该怎么同时连接三个路由器?
  7. 3P新产品开发管理实务
  8. HDU 1102 Constructing Roads
  9. 微信投票作弊神器的制作代码
  10. linux的消息队列的创建和实现
  11. CNN详解——反向传播过程
  12. win10一直正在检查更新_受够了WIN10自动更新?阿虚教你一键禁止!
  13. 【新手教程】如何在Win11上制作一个模仿MacOS的桌面?
  14. 父母脾气暴躁对孩子有哪些影响
  15. Google Colab 读取/存储 google drive(谷歌云盘)内的文件
  16. vue-cli项目局域网访问
  17. uni.showLoading,uni.hideLoading,uni.showToast,uni.showModal
  18. 应用统计学与计算机论文,应用统计硕士论文范文
  19. 应用层协议 HTTP HTTPS
  20. Java阻塞队列-BlockingQueue介绍及实现原理

热门文章

  1. 2021前端开发面试题:面试中该如何与HR谈薪资?
  2. html实心圆点特殊符号,和平精英名称添加圆点符号的方法 和平精英圆点符号代码分享...
  3. pdf关键字高亮 java_Java 查找、高亮PDF文本
  4. python做估值模型_理解债券估值中的摊销/摊余成本,利用EXCEL+Python估值建模
  5. 直线端点画垂线lisp_AutoCAD中利用AutoLISP开发小程序,实现快速画直线对称中心线...
  6. 51单片机—LED小灯的点亮及其流水灯程序
  7. [技术贴]网络共享与便携式WiFi热点之USB绑定模式
  8. TX2 配置xbox360无线手柄
  9. mysql blob类型图片输出到前端
  10. datax与datax-web安装部署