一、题目备份
maz 提取码:9v16
二、题目探索
下载下来后发现是exe文件,可以直接打开,于是打开后如下
信息不多,于是把它放入32IDA后可以看到
好奇的我看到了surprise的对比,IDA显示surprise也是一个字符型数组(char[ ]),于是我便去试了一下
结果却让我大吃一惊 = =
认真揣摩代码,发现在这里有一个setmap函数
既然是走迷宫,这里应该是类似布置迷宫地图的函数,而且0x20F转化为十进制是527,也就是memcpy刚好只拷贝到gwht前面的字符到map里面,我们继续往下看,能找到一个循环,仔细一看会发现它其实类似于一种认证环节
v5是我们输入的数据,输入下来会进到一个check函数,出来后的数值相当于踩到map上,进行一次IF检测。鼠标轻碰IF里面的49显示其实是一个char数值 对应的是 ‘1’ 意思是踩到的不能是地图上的 ‘1’ 也不能超过这个地图范围内,否则就byebye,而只有当出来的值等于End的时候就会出现Congratulation的提示,而End的值我们也可以点进去查看
121十六进制转化为十进制就是289
我们进去check函数里看一下,发现操纵的其实是一个start的值
start的值点进去也是有初始值的
52十六进制转化为十进制就是82,start开始就是82
然而在check函数里面还有一个change函数,再进去后发现是把输入的数值,进行一次异或
到这里我们整理一下这道题的思绪,差不多可以得出这样的思维导图
三、解决思路
我想先找到地图上有哪些位置是可以踩的,于是写了一个代码稍微还原了一些地图
在这里可以看到在82上有个s(start),在289上有个e(end),其实寓意着一个是迷宫的出发点,一个是迷宫的结束点,只要我们能使start数最后以289出来就行
然后继续探究操作start的check函数,把后面的条件里的数按R转换为char型
将他条件里的数值按照他的异或反着算回去
可以得到输入 g–将start减31,w–将start加31,h–将start减1,t–将start加1
顺着地图和操作数把这个迷宫慢慢走完= =
当然看一步走一步是非常难受的,而且很容易看错,所以答案并不是我一次过的,我甚至还打了个代码让我自己核对着地图看看我走的对不对
最后终于得到答案