记录一下做的第一道逆向迷宫题:攻防世界-reverse_re3
逆向好玩捏

首先看一下字符串,一眼丁真,倒数第二行有猫腻,进去看看
把数字转一下字符能发现存在a,w,s,d

主要逻辑函数如上
先看一眼sub86c是啥
1 | for ( i = 0; i <= 14; ++i ) |
可以看出迷宫应该是一个15*15的,且dword202020应该是地图数组
dword是啥?(我一开始真不知道
这些带着 dword_XXXXXX 的名字是反编译器(IDA/Ghidra)在没有符号表时自动生成的占位名。规则很机械:
byte_= 1 字节(8 bit)word_= 2 字节(16 bit)dword_= 4 字节(32 bit)qword_= 8 字节(64 bit)unk_= 类型未知的数据(反编译器还没推断出具体类型)- 后面的十六进制数字通常是该全局/静态对象在镜像中的加载地址偏移
所以当全局int变量看就好了,不难看出,3代表当前位置,202AB4记录当前行,202AB8记录当前列,但是这个迷宫是用一维数组存储的所以会有15*i+j,那225*dword_202AB0是啥,不知道,回原来的函数看看
1 | ... |
可以在下面看到这一段,如果202AB0等于2才能完成整个循环,不然又会进入迷宫逻辑的循环,202AB0从零开始,所以貌似是三轮迷宫,202AB0代表第几关,正好225=15*15,印证了我们的猜想,关卡不是分开存储的,而是存在一整个数组里了
所以先用关卡号*225才能定位到当前关卡。
然后rename一下这些名字很难看的变量

清晰多了

以向右移动的函数为例,先判断越没越界然后把右边下一个数字置为3,把原来位归1
如果到了终点(4) 返回1,循环里就会进入下一关,否则返回0,很清晰了,于是来看map

会发现这样一大坨,咱们取消掉dup然后按照15*15排列查看数组


开走迷宫!按照wasd方向把字母记录下来转md5就行了!
1 |
|