Bugku-Reverse-Take the maze
拖入 IDA 分析,shift + F12,找到长的像是会在主函数里出现的字符串,双击进入,并对字符串变量按 x 查看引用
进入到调用这个字符串的函数,F5 反编译,并进行简单的分析
先跟进去关键函数 sub_45E593 看看,可以看到一个很明显的长得像迷宫相关操作的部分
以 sub_45CC4D 为例,进去分析一下,其他的三个方向类似
从这个函数可以推测出这个迷宫一行有 26 个元素,又 311 == 11 * 26 + 25,再加上每一行的列标号从零开始,所以相当于从地图的左上角走到地图的(12, 25)的位置,即左上角走到右下角
而一个地方能向哪个方向走是通过两个数组的值异或得到的,例如说向下的这个方向能不能走是通过 dword_540548[i] ^ dword_540068[i] 的值来决定的
所以可以直接根据四个方向函数中的数组地址写出 IDC 脚本来判断某个节点是否可以往某个特定的方向走(shift+F2)
得到迷宫:
手动走一波:
得到路径:D1R1D3R1D1R6D3R4D2R9D1R4,其中方向 dlru 对应的是 v8 的 0234,对应转化后的字符串 v4 的 0234;步数 0-9 对应的是 v7 的 5-15,对应转化后的字符串 v4的 5-f
所以进入迷宫的字符串是:06360836063b0839073e0639
但是这是经过最开始 sub_45C748 函数变换过的字符,要得到我们需要的输入内容还需要去看一下 sub_45C748
我看不懂,但我大受震撼,用 OD 瞧瞧
载入 OD,使用中文搜索引擎帮助定位到主程序部分
输入 24 个 1 试试,发现这个 sub_45C748 其实是进行了一个按位异或,结果如下
于是干脆输入 06360836063b0839073e0639,它加密过后的样子就是我们真正要输入的内容
把 "07154=518?9i<5=6!&!v$#%." 输入ConsoleApplication1.exe:
生成了一个二维码
扫描后是:Congratulations! The flag is your input + “Docupa”
所以最终的 flag 就是:zsctf{07154=518?9i<5=6!&!v$#%.Docupa}