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的更多相关文章

  1. maze writeup

    maze writeup 攻防世界的一道迷宫题,第一次接触这样的题,个人感觉很有意思,收获也挺多,做一篇笔记记录一下. 程序分析 __int64 sub_4006B0() { signed __int ...

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

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

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

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

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

  6. 解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........

    这...................................................................... 我也是醉了 看不太懂,大神们求解............ ...

  7. C语言递归回溯法迷宫求解

    本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...

  8. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

  9. golang 实现广度优先算法(走迷宫)

    maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...

随机推荐

  1. 常见网络命令之Ping命令

    前言:计算机网络老师要求我们自己总结一下常见的网络命,然后上课可以上去讲一下这些命令使用,像我这么听话的好学生,肯定是照老师要求,认真的总结了一下,总结的过程中,我发现网上已经有的资源讲的都不是很详细 ...

  2. map,set的底层实现:红黑树[多图,手机慎入]

    最近天下有一种颇不太平的感觉,各地的乱刀砍人,到处是贪官服法.京东准备上市了,阿里最近也提交申请了,猎豹也逆袭了,据说猎豹移动在国际市场上表现甚是抢眼.只有屌丝还在写着代码.花开花又谢,花谢花又开,为 ...

  3. 设计模式之笔记--原型模式(Prototype)

    原型模式(Prototype) 定义 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 类图 描述 提供一个克隆自身的接口--Clone方法. 应用场景 ...

  4. redis之(十六)redis的cluster集群环境的搭建,转载

    最近redis已经比较火了,有关redis的详细介绍,网上有一大堆,我这里只作简单的介绍,然后跟大家一起学习Redis Cluster 3.0的搭建与使用.Redis是一款开源的.网络化的.基于内存的 ...

  5. Delphi使程序的窗口出现在最前面并激活

    procedure setAppFront(); //使程序的窗口出现在最前面并激活 var pt, OldPt, NewPt: TPoint; begin //判断Application是否最小化, ...

  6. AC日记——送花 洛谷 P2073

    送花 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...

  7. (error) DENIED Redis is running in protected mode because protected mode is enabled

    在通过Java程序链接配置好的redis服务时出现 DENIED Redis is running in protected mode because protected mode is enable ...

  8. php获取不到url问号之后的参数

    url规则已定义: RewriteRule ^/member/editprivilege/([0-9]+) /access.php?_u=mobile/editprivilege&aid=$1 ...

  9. nodejs pm2使用

    参考地址:http://www.jianshu.com/p/43525232b03b 参考地址:http://blog.csdn.net/leo_perfect/article/details/536 ...

  10. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...