打开题目拖入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函数伪代码查看得到的开头关于格式的限制。可以得到答案