【南京邮电】maze 迷宫解法
【南京邮电】maze 迷宫解法
- 题目来源:南京邮电大学网络攻防训练平台.
- 题目下载地址:https://pan.baidu.com/s/1i5gLzIt (密码rijss)
0x0 初步分析
题目中给出的执行文件是64位ELF可执行文件,可在64 位 Ubuntu下运行。这是一道简单的迷宫类型题目,通过静态分析即可获得flag。
在main函数中,能发现一段字符串
******* * **** * **** * *** *# *** *** *** *********
为了方便阅读:
- 空格替换为'.'
- 二维重排列(8x8)
..******
*...*..*
***.*.**
**..*.**
*..*#..*
**.***.*
**.....*
********
通过该地图,可以预判:
- '#' 为目标坐标
- 左上角为(0,0)
- '*' 为边界,空格(点)为通路
- 手动画出通往目标的线
这道题目的意思很清晰,假设有一个小人站在初始坐标上,我们要控制小人走到‘#’所在的坐标。
需要通过逆向分析得出:
- 小人的初始坐标
- 指令的对应关系(上下左右)
0x1 逆向分析
以下分析结果基于IDA的伪代码 、IDA流程图、IDA反汇编结果等。
标准输入
scanf("%s", &s1, 0LL);
格式验证
if ( strlen(&s1) != 24 || (v3 = "nctf{", strncmp(&s1, "nctf{", 5uLL)) || *(&byte_6010BF + 24) != '}' )
{
.......
}
输入应该以nctf{ 开头,以}结尾。
读取小人移动指令
char v5 = 0
int v4 = 5; // 从nctf{后面的第一个字节开始读取
if ( strlen(&s1) - 1 > 5 ) // s1 是scanf 输入的数据。
{
while ( 1 )
{
v5 = *(&s1 + v4);
............
确认x、y轴变量
main函数中调用的一处验证函数。
__int64 __fastcall sub_400690(__int64 a1, int a2, int a3)
{
__int64 result; // rax
result = *(unsigned __int8 *)(a1 + a2 + 8LL * a3);
LOBYTE(result) = (_DWORD)result == ' ' || (_DWORD)result == '#';
return result;
}
- a3 * 8 => a3参数对应y轴
- a2 对应x轴
- 通路为空格或#
a3 通过edx传递
a2 通过esi传递
main函数中验证行动合理性的代码
mov esi, dword ptr [rsp+28h+var_28+4] ;x
mov edx, dword ptr [rsp+28h+var_28] ;y
mov edi, offset asc_601060 ; " ******* * **** * **** * *** *# "...
call sub_400690 # 这个函数检查(x,y)是否合法,是不是通路
可以推断main函数中var_28 是y轴,var_28+4 是x轴。
main函数的头部可以找到初始化代码:
mov dword ptr [rsp+28h+var_28+4], 0
mov dword ptr [rsp+28h+var_28], 0
可以推断小人的初始坐标为(0,0)
四个方向的指令
为方便阅读,笔者已经对代码合并处理。
__int64 v10; // [rsp+0h] [rbp-28h]
if ( (unsigned __int8)v5 == 'O' )
{
v7 = sub_400650((char *)&v10 + 4, v3);
goto LABEL_14;
}
bool __fastcall sub_400650(_DWORD *a1)
{ // 减法操作
int v1; // eax
v1 = (*a1)--;
return v1 > 0;
}
v10 这个变量其实就是[rsp+28h+var_28],
v10的地址 + 4 就是x轴变量地址。
如果伪代码不清晰可以看反汇编。
所以得出指令‘O’:
O => x-=1
其它三条指令类似处理。
if ( v5 == 'o' )
{
v7 = sub_400660((char *)&v10 + 4, v3);
goto LABEL_14;
}
bool __fastcall sub_400660(int *a1)
{
int v1; // eax
v1 = *a1 + 1;
*a1 = v1;
return v1 < 8;
}
得出如下结论:
o => x+=1
if ( (unsigned __int8)v5 == '.' )
{
v7 = sub_400670(&v10, v3);
goto LABEL_14;
}
sub_400670 前文已经分析过,为减法操作。
得出:
. => y-=1
最后一个操作:
if ( v5 == '0' )
{
v7 = sub_400680(&v10, v3);
LABEL_14:
v6 = v7;
goto LABEL_15;
}
得出:
0 => y+=1
综合所有操作
O => x-=1 左移
. => y-=1 上移
o => x+=1 右移
0 => y+=1 下移
结果
nctf{o0oo00O000oooo..OO}
【南京邮电】maze 迷宫解法的更多相关文章
- [LeetCode] The Maze 迷宫
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- [LeetCode] 490. The Maze 迷宫
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- Maze迷宫问题(求最优解)
迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路. 文件如图: 每个坐标的位置用结构体来记录: struct Pos //位置坐标 { int _row; int _col; }; ...
- 南京邮电大学CTF隐写术部分Writeup
女神 听说这是女神的私房照,里面藏着flag哦 http://115.28.150.176/misc1.jpg 这个链接居然打不开,摔!万念俱灰!主办方可否给力点! P.S.为了方便日后学习,暂时列下 ...
- 南京邮电大学java程序设计作业在线编程第四次作业
王利国的的 "Java语言程序设计第4次作业(2018)" 详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:40 1.下列方法定义中,正确的是() A.doub ...
- 南京邮电大学java第一次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- 南京邮电大学java程序设计作业在线编程第三次作业
王利国的"Java语言程序设计第3次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 设有如下定义语句: String s1="My cat& ...
- 南京邮电大学java第二次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- 南京邮电大学java程序设计作业在线编程第二次作业
王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 表达式9==8&&3<7的运算结果是( ) ...
随机推荐
- “Project 'MyFunProject' is not a J2SE 5.0 compliant project.”
- python中强大的format函数
自python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串.语法 它通过{}和:来代替%. 请看下面的示例,基本上总结了format函数在python ...
- php等比例压缩图片
<?php function resizeImage($im,$maxwidth,$maxheight,$name,$filetype) { $pic_width = imagesx($im); ...
- phpstorm修改创建文件时的默认注释
之前也修改过,过了一段时间又忘了,记个笔记.下次好找 工具版本 工具设置里,File>>Settings...如下
- 共轭梯度算法求最小值-scipy
# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...
- python_如何实现可迭代对象和迭代器对象?
什么是可迭代对象? 列表.字符串 for循环的本质? for循环要确保in后面的对象为可迭代对象,如何确保? iter() 方法得到一个迭代器对象 不停.__next__() 方法对迭代器对象进行迭代 ...
- linkin大话设计模式--抽象工厂
linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢 ...
- JAVA中实现让程序等待一段时间的方法
JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一:通过线程的sleep方法. Thread.currentThread().sleep(1000); 在需要程序 ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: UNEXPECTED TOP-LE ...
- TP手册学习第三天
命令行先在cmd进入项目目录,再执行命令 生成index模块的Blog控制器类库文件:php think make:controller index/Blog 如果仅仅生成空的控制器则可以使用:php ...