南京邮电大学 RE-mze

打开题目拖入IDA,找到main函数。根据字符串提示,flag处理成功的条件。

将[rsp+28h+var_28+4]+[rsp+28h+var_28]*8作为字符串asc_601060的下标来取出字符放入eax处,然后将eax与23h相比,按R查看

即判断eax是否为#,是则flag成功。根据maze为迷宫的意思,判断该字符串就是我们要走的迷宫。再根据迷宫的下标之一rcx*8,判断迷宫为每行8个。将asc_601060处的字符串复制下来,每行八个分割,并用0替换空格方便观看。

python脚本处理

import re
def cut_text(text,lenth): 
 textArr = re.findall('.{'+str(lenth)+'}', text) 
 textArr.append(text[(len(textArr)*lenth):]) 
 return textArr 
a= '  *******   *  **** * ****  * ***  *#  *** *** ***     *********'
a=a.replace(' ','0')
for i in cut_text(a,8):
       print (i)
  

得到结果

00******
*000*00*
***0*0**
**00*0**
*00*#00*
**0***0*
**00000*
********

然后再看各分支条件。

按R将各个对比值显示成对应字符,进入各个函数。发现分别对r15与r14进行处理。

再往上看

r14与r15是两个初值为0的数的地址,也不难理解,即为两下标初始值0,0,也就是迷宫的起点。举例看一个对应的函数,sub_400680

[rdi]处的值增加了1,在该函数中rdi等于r14。结合

与开始的判断,得知该函数意为行数加1,即在迷宫中向上走一步。以此类推,不难知道其他三个字符对应的意思。根据字符所对应的走步方向,走迷宫到"#"即可得到对应flag。

再根据main函数伪代码查看得到的开头关于格式的限制。可以得到答案

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/82559613