2021长安杯学生组-snake
2021长安杯学生组-snake
这道题拿到手,我们可以发现,这道题开了很高的优化,使得我们一点点的分析代码比较困难,我们就直接看关键的步骤即可。
这里我们直接查一下flag
进入函数
![Untitled](./Untitled 2-16954567668451.png)
我们可以直接知道,游戏玩通关之后我们的flag会自动打印出来,但是这个函数中,其中关于值的,grid_mats这个数据是从外部传入的,我们可以猜测要么与wasd这中步骤数有关,要么与关卡数有关,要么与食物(身体长度有关)。我们查看交叉应用来看看到底是什么?
![Untitled](./Untitled 3-16954567845912.png)
通过这些函数名我们可以知道,这里的flag与卡关数是有关的
![Untitled](./Untitled 4-16954567892043.png)
主函数里面set_level是生成关卡的,因此操作还是在主函数中
![Untitled](./Untitled 5-16954567926444.png)
这里是一个关键地方,判断得分$与判断游戏结束的两个if,这两个if又在一个while循环里面,当我们吃到$的时候,我们就会跳出这个循环,由此我们可以知道,这个循环就是我们移动过程的判定循环,这里我们patch关于v11的判断,将其变成≠$就跳出,这样只要走一步就算是吃了$,但是我们patch之后运行,我们会发现动一下就说游戏结束了,也就是说,肯定还有什么比较关键的判断步骤,会直接让我们跳到重开。
![Untitled](./Untitled 6-16954567967525.png)
这个v79这个if判断,我们翻到后面可以知道
![Untitled](./Untitled 7-16954568002266.png)
必须当v79等于200的时候,才会打印我们的flag,我们可以知道,我们flag会进过200次的循环计算才能出现。
![Untitled](./Untitled 8-16954568033587.png)
通过这个函数我们可以知道,我们的v79代表的是我们的关卡
在上面的那个图中,有着一个进入show_score是一个判断,之后,便会失败
![Untitled](./Untitled 9-16954568072168.png)
这个v82在下面的计算之中,我们可以大致分析(猜)出,这个v82就是关卡判断,判定我们是不是过关了,当v82等于零的时候才算过关,不然就会跳到重开去,由此印证了上的猜测。这里我们同样patch将这个判断变成!v82,这样只要不是0都能过关,这样就是能让我随意按wasd就能直接过下关。
200关后得出我们的flag.
![Untitled](./Untitled 10-16954568105959.png)
做完之后,还是蛮有收获的,其实像这中游戏逆向等,大都那几个步骤,寻找关键函数,关键判断,然后通过patch,或者添加代码来让程序能快速的达到我们的目的。