迷宫问题

迷宫问题的特点:

1.在内存中布置一张“地图”
2.将用户输入限制在少数几个字符范围内
3.一般只有一个迷宫入口和一个迷宫出口

布置的地图可以由可显字符组成,也可以单纯用不可显的十六进制值进行表示,可以将地图直接组成一条非常长的字符串,或是一行一行分开布置。如果是一行一行分开布置的话,因为迷宫一般都会比较大,所以用于按行布置迷宫的函数会明显重复多次。

xctf 逆向新手区最后一题—maze

除去查壳等操作,直接拖入IDA中进行分析:

发现字符串比较,结论是flag必须是以nctf{开头。
接下来发现四个判断,每次判断后都进入相应的函数:

而每个函数又都非常简单,无非是加加减减,还有判断是否大于零小于八




如果没有见过maze问题的话,确实会有一点懵,如果见过的话,去字符串里看看就会发现一些有用的东西:

再根据大于零小于八的限制,就可以发现,这一串字符串实际上可以组成一个8*8的迷宫

然后是通过’.’,’0’,’o’,’O’来确定上下左右的移动。
那么最后走出迷宫就可以得到flag:nctf{o0oo00O000oooo..OO}

当涉及到的迷宫问题比较难解决的时候,或许可以通过深度搜索和广度搜索来解决迷宫问题,就比如CTF Wiki上的以到例题:
函数部分和上题差不多,但是迷宫很大:可能一个个去找会烦死。

参考资料:
https://ctf-wiki.github.io/ctf-wiki/reverse/maze/maze-zh/