【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)

news/2024/5/19 23:20:29 标签: 深度优先, 算法, ctf

ctfexewp_0">【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)

文章目录

  • 【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)
    • 1、迷宫简介
      • (1)简单例子
      • (2)一般的迷宫代码
    • 2、二维迷宫
      • (1)实际例题
      • (2)练习
      • (3)二维迷宫的思考
    • 3、三维迷宫
      • (1)二维进阶
      • (2)三维迷宫逆向
      • (3)练习
    • 4、总结

1、迷宫简介

迷宫问题是ctf逆向中的经典问题。

(1)简单例子

image-20210908102726837

CTF中,一般都是以二维迷宫来考核,二维数组m[x][y],x代表迷宫的长,y代表迷宫的宽。代表路和墙的字符可以任意(一般为可见字符)代表方向的字符也可以任意(一般为熟悉的wasd)。一般通过for+switch-case语句来判别你输入的路径字符,逐个匹配。

image-20210908103102173

(2)一般的迷宫代码

迷宫数据

image-20210908103126605

走迷宫的判断

image-20210908103132231

2、二维迷宫

(1)实际例题

迷宫地图

image-20210908104853276

关键check函数IDA中的代码

image-20210908104909765

所以,迷宫问题进来首先是要能看懂算法是表示的公告,即确定上下左右对应的字符,然后再根据迷宫判定条件,确定迷宫地图的大小及所有路径,最后即可确定有效路径。

(2)练习

这里有个简单二维迷宫的练习,包含wp

链接:https://pan.baidu.com/s/1Kwi152PZngHknQf20xgcbw
提取码:mq0d

(3)二维迷宫的思考

可以发现,一般遇到的二维迷宫,地图都比较小,直接肉眼就能造出路径,那其实这样的迷宫问题主要就是看我们能否识别迷宫算法

但当迷宫地图特别大的时候,我们怎么快速寻找路径呢?比如下面这个:

image-20210908111203614

这种,它迷宫地图又大,路径也不唯一,要想凭肉眼走,也不是不可以,只不过太麻烦了。

解决方法:

比较好的方法是利用BFS宽度优先搜索DFS深度优先搜索,这两个搜索算法

3、三维迷宫

(1)二维进阶

原始的二维地图为m[x][y],x代表长,y代表宽

image-20210908112523222

如果我们用多个二维地图堆积起来到h层

image-20210908112531172

(实在找不到好看的图了,这个比较形象。。。。)

即:用三维数组m[x][y][h]来表示地图,这里的h就恰好表示层数。

(2)三维迷宫逆向

难点:获取地图后很难通过自己看地图走出路径

解决:还是利用BFS宽度优先搜索DFS深度优先搜索,这两个搜索算法

这里提一下DFS深度优先搜索

DFS,深度优先搜索,形象点就比如:一个人来到分叉路口时,就是从一个节点一直往深处搜索,直到走到尽头,再往回走,走下一个节点,再次深搜……就相当于来回遍历,一个人走迷宫。

所以,dfs是运用递归的方法,基于回溯的思想。而回溯就是基于栈结构。栈结构的话,直接用数组来实现就可以了。

类似这样:image-20210908113037085

(3)练习

这里有个简单三维迷宫的练习,包含wp

链接:https://pan.baidu.com/s/1f3Ki3T7lSttTLGkORsRopg
提取码:qcmj

4、总结

二维迷宫比较简单,三维迷宫比较抽象,需要多练习才能熟悉。


http://www.niftyadmin.cn/n/120118.html

相关文章

Java 多线程 --- 线程协作 wait/notify

Java 多线程 --- 线程协作 wait/notifywait / notifyObject.wait() , Object.notify() / notifyAll()notify 和 wait 的原理notify会导致死锁的问题wait / notify的开销以及问题wait / notify 在多线程中, 如果程序拿到锁之后, 但是没有满足指定条件而不能继续往下执行, 我们可…

剑指 Offer II 017. 含有所有字符的最短字符串

题目链接 剑指 Offer II 017. 含有所有字符的最短字符串 hard 题目描述 给定两个字符串 s和 t。返回 s中包含 t的所有字符的最短子字符串。如果 s中不存在符合条件的子字符串,则返回空字符串 ""。 如果 s中存在多个符合条件的子字符串,返回任…

SpringBoot入门 - 配置热部署devtools工具

在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间;SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件,它试图提升开发调试的效率。准备知识点什么是…

A. Linova and Kingdom(dfs + 贪心)

A. Linova and Kingdom(dfs 贪心)一、问题二、思路三、代码一、问题 二、思路 这道题的大意就是,给我们一棵树,我们需要在树上选择kkk个点,然后让kkk个信使从我们选取的kkk个点向第一个点出发。 我们把我们选取的k个…

Unity之向量计算

文章目录前言向量加法向量减法向量乘法/除法向量点乘(内积)向量叉乘(外积)向量归一化向量小结前言 讲讲Unity中的向量有关知识,一些概念在初高中就学过,就不解释了。向量只能与自己相同维度进行计算&#…

Centos 部署Oracle 11g

Centos 部署Oracle 11g部署Oracle 11g准备工作服务器信息oracle安装包服务器准备oracle环境安装Oracle静默方式配置监听以静默方式建立新库及实例部署Oracle 11g 在SpringMVC模式下开发web项目,必然会使用到关系型数据库来存储数据,目前使用比较多的关系…

如何用PHP实现搜索引擎类?

搜索引擎是一种应用程序,用于在互联网上查找和索引信息,并将其呈现给用户以满足其需求。搜索引擎通常会收录互联网上的网页,并为用户提供检索功能,使用户可以通过输入查询词来获得相关的网页。搜索引擎的原理主要包括收录、索引和…

Verdaccio 搭建私有 npm 仓库

背景 公司内部封装业务相关的组件库,工具库,希望统一管理和维护,在多个项目中都能使用,同时希望不公开,只在局域网中使用。所以,需要搭建私有 npm 仓库 Verdaccio verdaccio 是一个能够创建私有 registr…