CTF-reverse二维四向迷宫路径求解

 二维四向迷宫是一个re中的常考点,说不上难,但也不简单,本篇记录了常规的二维四向迷宫解题套路以及帮助快速解题的脚本

可能你看我的教程会觉得十分繁琐,但实际只要你用了一次熟练之后,基本都是拿到迷宫就一题一分钟解决的,教程繁琐是在力求讲解清楚!

二维四向:指的是题目规定的迷宫应该是一个二维平面(有些题目用一维数组来实现二维迷宫也适用)且移动方向只有四个


一,将数据处理成二维列表

题目给出的数据往往不是二维列表(如果是就直接进行下一步),因此提供以下这个脚本用于快速将数据转换为二维列表

(一)题目提供的是字符组成的迷宫

(二)题目提供的是整数(通常是0和1)组成的迷宫

(三)脚本一:处理迷宫为二维列表

#str为ida中使用快捷键[shift+e]提取到的数据, 如果提取的是string literal则加上引号视作字符串,如果是C array(decimal)则加上中括号视作列表
str = "字符串"/[一维列表] 
s = 0 #s用作索引访问str, 供下面tmp列表取值#分析题目后设置迷宫的行列
row =  #设置二维迷宫行数
col =  #设置二维迷宫列数maze = []
for i in range(row):tmp = []for j in range(col):tmp.append(str[s])s+=1maze.append(tmp) #凑一行添加一行到迷宫中
print(maze)


二,调整下面这个脚本的参数获得路径

遇到二维四向迷宫(有时候分析ida反汇编可能是一维数组,但实际一定是一维数组当作二维用,所以需要上面的脚本来处理成二维列表)路径问题不要再眯着眼画路径了,脚本直接颗秒

需要调整的参数有:①二维列表迷宫,②起点、终点与障碍特征(若题目给出的数据的起点终点无特征, 手动添加特征即可, 障碍通常是1但有的题目也有可能是0或其它字符如'#')

(一)脚本二:获得迷宫路径

from collections import deque#设置二维四向迷宫, 如果题目是多个小迷宫问题, 拆分多次调用脚本获取路径即可
maze = 二维列表迷宫
path_len = 0x7fffffff#如果题目未给出终点坐标,则一定会指定路径的长度,在此处修改路径长度,否则请保留path_len的极大值#进行BFS寻找路径
def bfs(start, end, barrier):directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 定义四个方向的移动for i in range(len(maze)):#获取起点和终点在列表中的索引for j in range(len(maze[i])):if(maze[i][j] == start):start = (i, j)if(maze[i][j] == end):end = (i, j)#以下均是bfs算法套路queue = deque()queue.append((start, [start]))  # (当前位置, 路径)visited = set()visited.add(start)while queue:position, path = queue.popleft()if position == end:return pathelif len(path)==path_len:return pathfor d in directions:next_position = (position[0] + d[0], position[1] + d[1])if 0 <= next_position[0] < len(maze) and 0 <= next_position[1] < len(maze[0]) and \maze[next_position[0]][next_position[1]] != barrier and next_position not in visited:queue.append((next_position, path + [next_position]))visited.add(next_position)return None#执行BFS搜索并打印结果
if __name__ == '__main__':#maze[起点x坐标][起点y坐标] = 'S' #如果题目给了起点终点的坐标,在这里直接给起点和终点添加特征#maze[终点x坐标][终点y坐标] = 'E' path = bfs('S', 'E', 1) #bfs函数传入参数代表起点、终点、障碍的特征(若题目给出的数据无特征, 手动添加特征即可, 通常障碍是1也有可能是0或其它字符如'#')print("移动路径坐标:", path)print("移动路径方位:", end='')for i in range(1 ,len(path)):x1, y1, x2, y2 = path[i - 1][0], path[i - 1][1], path[i][0], path[i][1]if(x1 > x2):#上print("w", end='')elif(x1 < x2):#下print("s", end='')elif(y1 > y2):#左print("a", end='')elif(y1 < y2):#右print("d", end='')


三,获取路径的md5值

题目一般要求路径的md5值才是flag,使用如下网址进行md5加密

 md5在线加密:MD5在线加密/解密/破解—MD5在线 (sojson.com)


四,实战演练

为了让你更清楚的明白博主的脚本如何使用,下面用两道例题来说明——

两道题目都在此链接处,推荐自己尝试练习后再看讲解->迷宫练习题

(一)题一<help>

下载压缩包并解压得到exe文件

无壳64位,用ida64打开,根据main函数提示很容易想到是迷宫问题

进一步分析,发现本题的迷宫必须通过动态调试生成,因此开启动态调试,提取迷宫

断点打在CreateMap()函数末尾,F9开始调试

 

进入调试后双击map数组,发现是由1和0组成的迷宫,根据本篇标题【一.(二)】,此处快捷键【shift+e】后应选择【C unsigned char array(decimal)

 复制其中的数据到【一.(三)】的<脚本一:处理迷宫为二维列表>中,添加列表符号(即中括号)

再根据CreateMap()函数中对map数组的操作,确认该迷宫为16行16列

修改脚本中行列参数,运行脚本得到16*16的二维列表

将二维列表复制到【二.(一)】中的<脚本二:获得迷宫路径>

 分析check()函数得到起点坐标为(15, 1),且本题未给出确切终点而是在main函数中给出了路径长为54

因此修改脚本中的path_len为54+1,注意一定要+1,因为博主的bfs搜索算法中是先判断路径长度再进行搜索的,如果不+1会导致路径少一步(其实是懒得改算法了hhhh

然后再修改起点坐标为maze[15][1],这题给了路径长度没给终点所以不管终点

 

 参数准备完毕,直接运行脚本得到路径,最后无非是再把这个路径丢到本篇标题【】中在线md5加密就解决了

可能你第一次看这个教程时觉得有些繁琐,还不如自己把迷宫整理出来然后眯着眼画路径?

但其实只要用过一次脚本,明白流程之后,只需要修改一下迷宫、起点坐标、终点坐标或路径长度(有的题不给终点坐标但一定会给路径长度),就能直接运行出来路径flag,既保证了时间又保证了准确性

相信自己,万一你就是下一个一血CTFer呢?

(二)题二<maze>

本题和题一的流程基本一致,主要是为了让读者见识两个不同迷宫的处理办法,因此省略前面的大部分操作直接进入迷宫处理

用ida32打开后双击_maze变量,很显然这就是我们要处理的迷宫

区别于第一题的是,这次是字符组成的迷宫,根据本篇标题【一.(二)】,此处快捷键【shift+e】后应选择【string literal

 复制时注意复制有效数据,复制其中的数据到【一.(三)】的<脚本一:处理迷宫为二维列表>中,添加双引号作为字符串处理

根据后续的move()函数分析得知该迷宫应为8*8,所以设置迷宫行列为8,运行获得二维列表

将二维列表复制到【二.(一)】中的<脚本二:获得迷宫路径>中,这里的path_len就不用修改了,因为本题直接给出了终点和起点的特征'S'和'E',所以不要修改它这个极大值0x7fffffff!

因为原数据已经将起点标志为'S'终点标志为'E'了,所以这题连坐标参数(37、38行)也不用改,所以看下来也只改了迷宫这一个位置

最后直接运行获得路径,再把这个路径丢到本篇标题【】中在线md5加密就解决了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter控制器讲解

1&#xff0c;随机顺序控制器和随机控制器的区别&#xff1a;随机顺序控制器下所有的接口都会执行&#xff0c;只是执行顺序是随机的&#xff0c;随机控制器下所有的接口中随机执行一个接口&#xff0c;其余接口不执行。

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊&#xff0c;一种全新的购物平台——TikTok商城&#xff0c;正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中&#xff0c;了解如何有效利用TikTok Shop的各项功能&#xff0c;理解其独特的运营模式&…

Linux进程——Linux进程间切换与命令行参数

前言&#xff1a;在上一篇了解完进程状态后&#xff0c;我们简单了解了进程优先级&#xff0c;然后遗留了一点内容&#xff0c;本篇我们就来研究进程间的切换&#xff0c;来理解上篇提到的并发。如果对进程优先级还有没理解的地方可以先阅读&#xff1a; Linux进程优先级 本篇…

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

C++之大数运算

溪云初起日沉阁 山雨欲来风满楼 契子✨ 我们知道数据类型皆有范围&#xff0c;一旦超出了这个范围就会造成溢出问题 今天说说我们常见的数据类型范围&#xff1a; 我们平时写代码也会遇到数据类型范围溢出问题&#xff1a; 比如 ~ 我们之前写的学生管理系统在用 int类型 填写…

stack的使用

1.栈的定义 我们可以看到模板参数里面有一个容器适配器 &#xff0c;什么是适配器&#xff1f;比如充电器就叫做电源适配器&#xff0c;用在做转换&#xff0c;对电压进行相关的转换适配我们的设备。栈&#xff0c;队列不是自己直接管理数据&#xff0c;是让其他容器管理数据&a…

java-函数式编程-语法

目录 1、函数表现形式 分类 lambda表达式 参数类型可以全写&#xff0c;也可以全不写&#xff0c;但不能一部分写&#xff0c;一部分不写lambda 的省略策略&#xff1a;凡是可推导&#xff0c;都可以省略 方法引用 练习-判断语法正确性 练习-写出与方法引用等价的lambda表达式…

新火种AI|马斯克聘用OpenAI泄密者,他们的梁子着实越结越深...

作者&#xff1a;小岩 编辑&#xff1a;彩云 就在最近&#xff0c;昔日就职于OpenAI的工程师Pavel Izmailov正式加入了马斯克的AI团队&#xff0c;他还在自己的推特上大张旗鼓的做着宣传&#xff1a;研究院xai。 AI工程师的跳槽本不值得惊讶&#xff0c;但Pavel的跳槽却在行…

LSTM神经网络 vs Transformer在量化中的应用

LSTM,全称Long Short-Term Memory,是一种特殊的递归神经网络。它通过巧妙的"门"结构,可以有效地捕捉时间序列数据中的长期依赖关系。这一特点,使得LSTM在处理股价这种具有时间序列特性的数据时,展现出了非凡的潜力。 这种特殊的递归神经网络 与一般的前馈神经网络不…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类&#xff0c;实现它的拷贝构造并重载赋值运算符。 class T…

盘点四种计算数组中元素值为1的个数的方法

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;使用内置函数sum和生成器表达式 五、方法四&#xff1a;使用NumPy库 六、性能比较 七、性能结果分析与讨论 八、最佳实践 九、总结 一、引言 在编程和数…

银河麒麟QT项目打包详细教程

银河麒麟QT项目打包详细教程 一、QT项目打包 下载linuxdeployqt&#xff0c;下载地址&#xff1a;https://github.com/probonopd/linuxdeployqt/releases 安装Linuxdeployqt 2.1 为了安装方便&#xff0c;将下载下来的文件名称改短些 mv linuxdeployqt-6-x86_64.AppImage lin…

92、动态规划-最小路径和

思路&#xff1a; 还是一样&#xff0c;先使用递归来接&#xff0c;无非是向右和向下&#xff0c;然后得到两种方式进行比较&#xff0c;代码如下&#xff1a; public int minPathSum(int[][] grid) {return calculate(grid, 0, 0);}private int calculate(int[][] grid, int …

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

Vmware虚拟机瘦身及Samba服务不可用问题解决

虚拟机磁盘空间膨胀是一个令人头疼的问题&#xff0c;特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发&#xff0c;都面临着这个难题。首先&#xff0c;操作系统本身就已占用不少空间&#xff0c;更新安装包&#xff0c;再下载一些开源软件&#xff0c;剩…

运行Spring Boot项目失败?显示java: 无法访问org.springframework.boot.SpringApplication,让我来看看~

idea项目运行报错截图&#xff1a; &#xff08;1&#xff09;查看错误提示“类文件具有错误的版本 61.0, 应为 52.0”&#xff0c;61.0对应的是jdk17&#xff0c;52.0对应1.8。 通过这个网址可以查询版本&#xff1a; https://stackoverflow.com/questions/9170832/list-of-ja…

网络编程入门之UDP编程

欢迎各位帅哥美女来捧场&#xff0c;本文是介绍UDP网络编程。在这里&#xff0c;你会见到最详细的教程&#xff1b;细致到每一行代码&#xff0c;每一个api的由来和使用它的目的等。 目录 1.UDP相关API 1.1.两个类 1.2.两个类中的方法 2.UDP编程 2.1.大体框架 2.2.内容构…

【项目学习01_2024.05.08_Day06】

学习笔记 5 新增课程5.1 需求分析5.1.1 业务流程5.1.2 数据模型 5.2 接口定义5.3 接口开发5.3.1 保存课程基本信息5.3.2 保存营销信息 5.4 接口测试 5 新增课程 5.1 需求分析 5.1.1 业务流程 5.1.2 数据模型 5.2 接口定义 5.3 接口开发 根据需求分析&#xff0c;新增课程表…

【智能楼宇秘籍】一网关多协议无缝对接BACnet+OPC+MQTT

在繁华的都市中心&#xff0c;一座崭新的大型商业综合体拔地而起&#xff0c;集购物、餐饮、娱乐、办公于一体&#xff0c;是现代城市生活的缩影。然而&#xff0c;这座综合体的幕后英雄——一套高度集成的楼宇自动化系统&#xff0c;正是依靠多功能协议网关&#xff0c;实现了…

韩国站群服务器提供高级安全防护以确保数据和网站的安全性

韩国站群服务器提供高级安全防护以确保数据和网站的安全性 在当今数字化时代&#xff0c;网站的安全性和数据保护已成为企业和个人不可忽视的重要议题。韩国站群服务器作为一个拥有发达科技和互联网基础设施的国家&#xff0c;通过提供高级安全防护措施&#xff0c;为用户的数…