攻防世界-Reverse区WP--maze

简介: 攻防世界-Reverse区WP--maze

 疫情当下,都已经耍了半个月了,都不知道干啥了,无聊中,那就写了Reverse解题记录吧。

maze
根据题目描述可知这是一道迷宫题。用IDA64打开,F5将主函数main反编译成C伪代码:

int64 fastcall main(int64 a1, char a2, char a3)
{
signed
int64 v3; // rbx
signed int v4; // eax
bool v5; // bp
bool v6; // al
const char *v7; // rdi
__int64 v9; // [rsp+0h] [rbp-28h]

v9 = 0LL;
puts("Input flag:");
scanf("%s", &s1, 0LL);
if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || (&byte_6010BF + 24) != '}' )
{ // flag长度为24 并且由nctf{}包裹
LABEL_22:
puts("Wrong flag!");
exit(-1);
}
v3 = 5LL;
if ( strlen(&s1) - 1 > 5 )
{
while ( 1 )
{
v4 =
(&s1 + v3); // 从flag花括号内的第一个字符开始比对
v5 = 0;
if ( v4 > 'N' )
{
v4 = (unsigned int8)v4;
if ( (unsigned
int8)v4 == 'O' )
{
v6 = sub_400650((_DWORD )&v9 + 1);
goto LABEL_14;
}
if ( v4 == 'o' )
{
v6 = sub_400660((int
)&v9 + 1);
goto LABEL_14;
}
}
else
{
v4 = (unsigned int8)v4;
if ( (unsigned
int8)v4 == '.' )
{
v6 = sub_400670(&v9);
goto LABEL_14;
}
if ( v4 == '0' )
{
v6 = sub_400680((int )&v9);
LABEL_14:
v5 = v6;
goto LABEL_15;
}
}
LABEL_15:
if ( !(unsigned int8)sub_400690((int64)asc_601060, SHIDWORD(v9), v9) ) // 检测是否发生碰撞 只有' '和'#'是可行走的
goto LABEL_22;
if ( ++v3 >= strlen(&s1) - 1 )
{
if ( v5 )
break;
LABEL_20:
v7 = "Wrong flag!";
goto LABEL_21;
}
}
}
if ( asc_601060[8
(signed int)v9 + SHIDWORD(v9)] != '#' ) //循环结束判断 是否到达迷宫终点'#'
goto LABEL_20;
v7 = "Congratulations!";
LABEL_21:
puts(v7);
return 0LL;
}

其中 SHIDWORD(v9)即 &v9 + 1 ,迷宫字符串asc_601060[]如下,长度为64:

* ** * * # ** *
根据以下代码能够判断出 &v9 为纵坐标(所在行), &v9+1为横坐标(所在列),迷宫是8*8规格的。

if ( asc_601060[8 * (signed int)v9 + SHIDWORD(v9)] != '#' ) //判断是否到达迷宫终点'#'
其中逻辑为:

当前位置 = 8(迷宫横长) * 当前纵坐标(所在行) + 当前纵坐标(所在列)
其中横纵坐标由0开始算。又根据伪代码中四个 if判断中的函数判断移动四个方向:

bool __fastcall sub_400650(_DWORD a1) // a1为 &v9+1(横坐标)
{ // v4 = 'O'
int v1;
v1 = (
a1)--; // 横坐标-1 向左移动
return v1 > 0; // 是否超出边界
}

bool __fastcall sub_400660(int a1) // a1为 &v9+1
{ // v4 = 'o'
int v1;
v1 =
a1 + 1; // 横坐标+1 向右移动
*a1 = v1;
return v1 < 8;
}

bool __fastcall sub_400670(_DWORD a1) // a1为 v9(纵坐标)
{ // v4 = '.'
int v1;
v1 = (
a1)--; // 纵坐标-1 向上移动
return v1 > 0; // 超界判断
}

bool __fastcall sub_400680(int a1) // a1为 v9
{
int v1; // v4 = '0'
v1 =
a1 + 1; // 纵坐标+1 向下移动
*a1 = v1;
return v1 < 8;
}

将迷宫字符串以8*8格式打印出来(起点在左上角,终点为#)





  • #



走出迷宫方式为:右下右右下下左下下下右右右右上上左左 对应flag字符串:o0oo00O000oooo…OO 字符串长度刚好也对应为程序开头的判断(18+6=24) 在Linux虚拟机内运行验证也正确。

目录
相关文章
如何获取与设置光标在input框的位置
如何获取与设置光标在input框的位置
如何获取与设置光标在input框的位置
|
数据管理 容器 BI
公开课05期 |基于宜搭的《招聘管理》应用搭建
本文章将以《招聘管理》场景为例,介绍通过Excel导入成线上系统的详细步骤。
13597 0
公开课05期 |基于宜搭的《招聘管理》应用搭建
|
项目管理 敏捷开发 Cloud Native
带你读《软件项目管理案例教程(第4版)》之一:软件项目管理概述
本书以案例形式讲述软件项目管理过程,借助路线图讲述项目管理的理论、方法及技巧,覆盖项目管理十大知识域的相关内容,重点介绍软件这个特殊领域的项目管理。本书综合了多个学科领域,包括范围计划、成本计划、进度计划、质量计划、配置管理计划、风险计划、团队计划、干系人计划、沟通计划、合同计划等的制定,以及项目实施过程中如何对项目计划进行跟踪控制。该书取材新颖,注重理论与实际的结合,通过案例分析帮助读者消化和理解所学内容,既适合作为高等院校计算机、软件及相关专业高年级本科生和研究生的教材,也适合作为广大软件技术人员和项目经理培训的教材,还可作为软件开发项目管理人员的参考书。
|
机器学习/深度学习 数据可视化 TensorFlow
一文入门卷积神经网络:CNN通俗解析
CNN基础知识介绍及TensorFlow具体实现,对于初学者或者求职者而言是一份不可多得的资料。
21641 0
|
存储 消息中间件 监控
消息中间件系列四、认识AMQP和RabbiyMq的简单使用
AMQP AMQP(advanced message queuing protocol)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制 。
4181 121
|
机器学习/深度学习 传感器 算法
【湍流】基于kolmogorov结合次谐波补偿的方法生成大气湍流相位屏附matlab代码
【湍流】基于kolmogorov结合次谐波补偿的方法生成大气湍流相位屏附matlab代码
812 0
|
Windows
FL Studio21中文版本下载及切换中文语言教程
1、FL Studio 20.8版本开始才支持简体中文,早于20.8的版本没有官方中文版。 2、中文版建议使用Win10系统电脑,win7系统上目前可能会出现乱码。 FL Studio 20.8版本安装后默认还是英文,需要我们手动切换一下软件语言:
1292 0
|
机器学习/深度学习 存储 人工智能
【前沿技术RPA】 一文学会用UiPath实现电子邮件自动化(Email Automation)
UiPath在传统的RPA(Robotic process automation)的基础上,增加了See(AI通过计算机视觉阅读用户的计算机屏幕)和Think(通过机器学习来发现平台能够为用户构建什么自动化流程)从而不断帮助用户自动化构建流程,而不仅仅是用户自主发现,自主构建。并且在构建的过程当中,做到了Low-code甚至是No-code的程度,让每一位员工都可以自主使用。
【前沿技术RPA】 一文学会用UiPath实现电子邮件自动化(Email Automation)
|
Web App开发 XML JSON
Charles使用教程
Charles是在您自己的计算机上运行的网页代理(HTTP代理/ HTTP监视器)。 然后将您的网页浏览器(或任何其他网络应用程序)配置为通过Charles访问网络,然后Charles可以为您记录和显示所有发送和接收的数据。
1219 0
Charles使用教程