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}

posted @ 2021-06-03 19:39  Moominn  阅读(157)  评论(0编辑  收藏  举报