【南京邮电】maze 迷宫解法

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 迷宫解法的更多相关文章

  1. [LeetCode] The Maze 迷宫

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  2. [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 ...

  3. Maze迷宫问题(求最优解)

    迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路. 文件如图: 每个坐标的位置用结构体来记录: struct Pos //位置坐标 { int _row; int _col; }; ...

  4. 南京邮电大学CTF隐写术部分Writeup

    女神 听说这是女神的私房照,里面藏着flag哦 http://115.28.150.176/misc1.jpg 这个链接居然打不开,摔!万念俱灰!主办方可否给力点! P.S.为了方便日后学习,暂时列下 ...

  5. 南京邮电大学java程序设计作业在线编程第四次作业

    王利国的的 "Java语言程序设计第4次作业(2018)" 详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:40  1.下列方法定义中,正确的是() A.doub ...

  6. 南京邮电大学java第一次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  7. 南京邮电大学java程序设计作业在线编程第三次作业

    王利国的"Java语言程序设计第3次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60  1. 设有如下定义语句: String s1="My cat& ...

  8. 南京邮电大学java第二次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  9. 南京邮电大学java程序设计作业在线编程第二次作业

    王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60  1. 表达式9==8&&3<7的运算结果是( ) ...

随机推荐

  1. CCF系列之I’m stuck!(201312-5)

    试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', ...

  2. Select、Poll、Epoll、 异步IO 介绍

    一.概念相关介绍 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的net ...

  3. 让我们一起爱(装)上Homestead吧

    本文是Laravel实战:任务管理系统(一)的扩展阅读原文链接 先来点残酷现实:  真正用过homestead的,一般不会问homestead到底好在哪里 如果你还没有爱上homestead,只能说明 ...

  4. mysql中能够使用索引的典型场景

    mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip 匹配全值 explain select * from rental where re ...

  5. python3 第九章 - 数据类型之Number(数字)

    Python 支持三种不同的数字类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 ...

  6. Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  7. JDK自带的Timer类

    Timer类负责设定TimerTask的起始和间隔执行时间.具体的执行任务,由用户创建一个TimerTask的继承类,并实现其run()方法 timer.schedule()

  8. 【转】sed正则表达式

    1 正则表达式简介 正则表达式(Regular Expression) 是一种描述文本(或字符串)模式的工具.正则表达式常用于查找文本的场合.想想一下我们日常生活中的例子,假如你想从电话本里找一个联系 ...

  9. 【转】12 TOP Command Examples in Linux

    12个top命令 1. # top 2. # top,后输入shift+O,在“Current Sort Field:”中选左边的field对应的字母进行排序. 3. # top -u tecmint ...

  10. SQL语句-delete语句

    delete语句 delete语句用于删除表中已经存在的整行数据 Tbl_name关键词代表删除数据的目标表 Where子句代表被删除数据的满足条件,如果没有where子句则代 表所有表数据都删除 O ...