长安杯2021-snake复现

这次复现可以加强对IDA使用的理解

全网只搜到了这个人的文章:

2021长安杯—snake题解

另外一篇是这个人在博客园上的发帖

整个复现过程并不顺利,因为帖子只讲了原理,没有具体到步骤的介绍,IDA操作不熟练直接GG,我摸索了一天才复现成功。

最主要的地方在于,那篇帖子其实是用了IDA的远程调试的,然而通篇没有任何提示。静态分析完以后,发现也可以直接静态patch出解

环境准备

IDA Pro 7.6

无keypatch插件

正文

在NSSCTF下载附件

把文件拖进IDA64分析逻辑

image.png

在一个while(1)里,有三个跳到LABEL13(Game Over),可以进行修改(尽管从结果来看并没有必要),里面有个LABEL17可以跳出循环

这里就会遇到第一种情况:F5后的C语言是不能直接修改汇编的

这时候,你需要先开启一个子窗口

view-open subviews-disassembly

右键选择Synchronize with,这样C语言的指令就会导向汇编的窗口,就可以在汇编的窗口上面打补丁

image.png

就会产生绿色的光标,与右边同步

image.png

由于中间太长,直接跳到最下面,有一个calc_flag引起了注意

image.png

这个函数会打印flag,而唯一与控制打印有关系的是grid_mats,而grid_mats只跟wasd方向键有关系

image.png

找前面流程,判断条件是v82会有可能导致重回while(1)循环里面

image.png

这个 v79!=200 下面,是一个非常长的循环内容(if就是循环的判断条件),贴到VScode里会发现有其内容从177-455,就是贪吃蛇的主体内容,由此可以判断这个v79是判断level数的

image.png

因为show_score的传参正是v79

image.png

当时脑袋一热,直接把200改成1,然后喜提假flag,到NSSCTF上面提交老半天不过

2022-08-19_11-15.png

猜一下,估计是wasd按的数量不足导致的,就是金币必须吃足,而且做到每吃一个金币,level都会提升,那就把v82取反即可。

image.png

但这样的速度还是太慢了,而且要是做到最后每录像就得重做,emmm

那就得让金币每走一步都能吃到

image.png

即不管怎么走,都能走到LABEL17里面。要达成这个目的两个判断条件取反即可

这样,只要狂按wasd,就能快速得到正确的flag

image.png

结语

由于没有key patch插件,需要鼠标手动patch,在Edit->Patch Program->Change bytes手动修改机器码

不知道机器码的,可以在这在线汇编生成器上找到提示

Online Assembler and Disassembler

为数不多有大收获的逆向题目,争取下一次配置好IDA远程调试的环境