【bugku】【ZSCTF】【迷宫RE】Take The Maze WriteUp
Take The Maze
首先拿进PEID里查一下有没有壳:
无壳,果断拖进IDA。可是Graph View中找不到主程序的位置,在函数表里寻找主函数:

函数太多阻扰了我们找到主程序,运行一下程序找一些关键词来搜索主程序位置:

得知主程序中应当含有“welcome to zsctf!”字符串,在IDA中搜索来找到主程序:

成功找到主函数,双击进入主函数,F5出伪代码:

可以看出输入的KEY为24位由0-9,a-f构成的字符串,且需要根据sub_45E593()的返回值确定是否为正确KEY。其他函数先放下,先分析一下sub_45E593():

多个if对应多个处理函数,且根据dlru初步猜测是迷宫问题。先来看看这个byte_541168存着什么:

该数组存的是"delru0123456789",在回过头分析四个if上面的switch语句:

可以根据两次的自加操作判断,输入的数据两两为一组。而且drc的值被用于在下面的if语句中判断是byte_541168[]前五个中的哪一个字符,所以drc就决定了迷宫的走向。stp是朝着byte_541168[drc]方向行走的步数。
点开四个if对应的函数分别分析一下:

从这个函数可以推测出这个迷宫一行有26个元素。根据中pos == 311则return true,而311 == 11 * 26 + 25,再加上每一行的列标号从零开始,所以相当于从地图的左上角走到地图的(12, 25)的位置,即左上角走到右下角。
而且在上图向下走的函数中,往下走能否可行是根据dword_540548[i] ^ dword_540068[i]的值来确定的,所以可以直接根据四个方向函数中的数组地址写出IDC脚本来判断某个节点是否可以往某个特定的方向走。IDC脚本如下:
auto i;
for(i = ;i <= ; ++i){
if(Dword(0x540548 + i * ) ^ Dword(0x540068 + i * ))
Message(".");
else
Message("D"); if(Dword(0x5404DC + i * ) ^ Dword(0x53FFFC + i * ))
Message(".");
else
Message("L"); if(Dword(0x5404E4 + i * ) ^ Dword(0x540004 + i * ))
Message(".");
else
Message("R"); if(Dword(0x540478 + i * ) ^ Dword(0x53FF98 + i * ))
Message(".");
else
Message("U"); Message(" ");
if(!((i + ) % ))
Message("\n\n");
}
return ;
在IDA中执行效果如下:

放到记事本里走一遍迷宫:

手动走迷宫走出来的字符串为06360836063b0839073e0639,结果输到程序里发现还是错误的KEY,返回到主函数检查一下有没有加密函数:

v5因为地址和v4紧挨着,所以v5其实就是v4[16],所以v5 ^= 1就相当于v4[16] ^= 1。这是加密的第一部分,分析一下疑似为加密函数的sub_45C748():

。。。。。。这tm是什么玩意儿。
看不太懂这是什么神奇加密,移步OD碰下运气。
令输入的字符串为24个“1”,步过这加密函数后它变成了这样:

右下角的框框高亮部分就是经过加密函数的样子。
。。。。。。这不就是按位异或吗加密函数那么复杂作死啊??
再试验一组24个“0”,发现其实是按位异或了一下,python脚本如下:
a = list("06360836063b0839073e0639")
a[16] = chr(ord(a[16]) ^ 1)
for i in range(24):
print chr(ord(a[i])^i),
跑出来结果如下:

去掉空格就是真正的KEY了,输进程序里面:

工作目录下便生成了一个.png文件,点开发现是个二维码:

扫出来:

把之前解出来的KEY后面加上Docupa就是zsctf{}中括号里的内容啦!
【bugku】【ZSCTF】【迷宫RE】Take The Maze WriteUp的更多相关文章
- maze writeup
maze writeup 攻防世界的一道迷宫题,第一次接触这样的题,个人感觉很有意思,收获也挺多,做一篇笔记记录一下. 程序分析 __int64 sub_4006B0() { signed __int ...
- [Swift]LeetCode1036.逃离大迷宫 | Escape a Large Maze
In a 1 million by 1 million grid, the coordinates of each grid square are (x, y) with 0 <= x, y & ...
- Maze迷宫问题(求最优解)
迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路. 文件如图: 每个坐标的位置用结构体来记录: struct Pos //位置坐标 { int _row; int _col; }; ...
- [LeetCode] 499. The Maze III 迷宫 III
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- [LeetCode] 505. The Maze II 迷宫 II
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- 解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........
这...................................................................... 我也是醉了 看不太懂,大神们求解............ ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- Java与算法之(5) - 老鼠走迷宫(深度优先算法)
小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...
- golang 实现广度优先算法(走迷宫)
maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...
随机推荐
- Java中基于HotSpot虚拟机的垃圾收集器
名称 过程 优缺点 Serial 进行垃圾收集时,必须暂停其他所有的工作进程,直到它收集结束.是一个单线程收集器. Stop the world. 新生代收集器. 手工设置新生代的大小:-Xmn Ed ...
- FindQQByProcess
看网上有许多通过进程寻找QQ号的例子,看了一下,里面涉及的知识点还是比较多,但网上的兼容性不太好,而且没有给出匹配字符的来源,所以自己动手写了一下,顺便给出一些我调试的结果. #include &qu ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- Low overhead memory space management
Methods, apparatus, and systems, including computer programs encoded on a computer storage medium, m ...
- 2015多校第9场 HDU 5405 Sometimes Naive 树链剖分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5405 题意: 给你一棵n个节点的树,有点权. 要求支持两种操作: 操作1:更改某个节点的 ...
- App推广
一行业常见名词解释 开发商:也叫CP,即Content Provider内容提供商的英文首字母缩写. 发行商(运营商):即代理CP开发出来的产品. 渠道:拥有用户,能够进行流量分发的公司,即可成为渠道 ...
- HDU 3669 Cross the Wall(斜率DP+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...
- Python+Selenium 自动化实现实例-Link 捕捉元素的几种方法
from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com&quo ...
- Git----创建远程分支,并将文件上传到创建的远程分支上
1.首先创建一个远程仓库 2.将远程仓库克隆到本地 (1)本地新建文件夹,命令行进入文件夹,执行clone操作 (2) git clone git@github.com:Lucky-Syw/lucky ...
- AC日记——魔法森林 洛谷 P2387
魔法森林 思路: spfa水过(正解lct); 代码: #include <bits/stdc++.h> using namespace std; #define maxn 50005 # ...
