![](https://i-blog.csdnimg.cn/blog_migrate/afb656bc557fd185c9bf2615e127660c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34f153cbda8e50681e27eb60cce3f265.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6662bf689988694a523875749542feaa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b4c68d9f67ce20334fff8e67f65647ec.png)
大致流程就是输入值,程序根据你的输入值进行各种判断,并对程序内的某些变量进行操作,通过判断后又把之前参与变动的变量作为数组(v7)的偏移地址,判断在该地址的v7的值是否等于49或35。若等于前者,则程序结束,等于后者则提示成功
根据输出的提示,我们知道输入的数字分别代表4个方向(up down left right),而当执行up或down时v3[25]分别-1或+1;执行left或right时v4分别-1或+1。所以先暂时假定v3[25]代表纵坐 标,v4代表横坐标。
再看看结合整个程序和声明的变量得知:只有v7没有值,但v7参与了判断。有理由怀疑v7地址与某一变量是有联系的。唯一一次用到v7的地方有一个莫名的数字:41,为什么减41呢,百思不得其解。再想想,41存在于v7的偏移地址计算中,所以41是与地址有关?
我们找到v7的首位地址,在十六进制计算器中将地址减去41,好家伙,刚好是v3的首位地址!
将判断语句转换成v3的“风格” :v3[5*v3[25]+v4]
之前拟定v3[25]代表纵坐标,v4代表横坐标,这个表达式像什么?
答:二维数组!
再结合判断语句:如果等于49('1')结束程序;等于35('#')提示成功
这不就是判断当前坐标么,之前对变量的操作就是对当前坐标进行变化
看看v3的元素
![](https://i-blog.csdnimg.cn/blog_migrate/1a7c1147fb5c1e2f824a1dc6a3afbebd.png)
根据之前得到的信息,v3字符串区域可看作是二维数组,且有5列(5*v3[25]),我们把v3的字符串分为5列
![](https://i-blog.csdnimg.cn/blog_migrate/5d7980747761c7052dc7331928746159.png)
最后的判断:碰到'#'提示成功,碰到'1'结束程序,要想成功,就不能碰到'1',从*位置开始移动到'#',所以这是一个5*5的迷宫,而移动输入的数字就是flag
所以得到flag{222441144222}
笔记:
![](https://i-blog.csdnimg.cn/blog_migrate/ad7b0020ab06d39fb851f98b464e8683.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bce635548b9df11a2708e75ff6c0b695.png)
通过对v3的计算可得知,v4就是v3[28]
未解决问题:v[25]未找到初始化的步骤
PS:这是我写过最难的攻略了,做题当然不难,难点在怎么给读者描述自己的思路过程,因为很多东西是靠经验理解的,属于是“只可意会,难以言传”。佩服那些写书的大佬。