长安杯2021-snake复现
长安杯2021-snake复现
这次复现可以加强对IDA使用的理解
全网只搜到了这个人的文章:
另外一篇是这个人在博客园上的发帖
整个复现过程并不顺利,因为帖子只讲了原理,没有具体到步骤的介绍,IDA操作不熟练直接GG,我摸索了一天才复现成功。
最主要的地方在于,那篇帖子其实是用了IDA的远程调试的,然而通篇没有任何提示。静态分析完以后,发现也可以直接静态patch出解
环境准备
IDA Pro 7.6
无keypatch插件
正文
在NSSCTF下载附件
把文件拖进IDA64分析逻辑
在一个while(1)里,有三个跳到LABEL13(Game Over),可以进行修改(尽管从结果来看并没有必要),里面有个LABEL17可以跳出循环
这里就会遇到第一种情况:F5后的C语言是不能直接修改汇编的
这时候,你需要先开启一个子窗口
view-open subviews-disassembly
右键选择Synchronize with,这样C语言的指令就会导向汇编的窗口,就可以在汇编的窗口上面打补丁
就会产生绿色的光标,与右边同步
由于中间太长,直接跳到最下面,有一个calc_flag引起了注意
这个函数会打印flag,而唯一与控制打印有关系的是grid_mats,而grid_mats只跟wasd方向键有关系
找前面流程,判断条件是v82会有可能导致重回while(1)循环里面
这个 v79!=200 下面,是一个非常长的循环内容(if就是循环的判断条件),贴到VScode里会发现有其内容从177-455,就是贪吃蛇的主体内容,由此可以判断这个v79是判断level数的
因为show_score的传参正是v79
当时脑袋一热,直接把200改成1,然后喜提假flag,到NSSCTF上面提交老半天不过
猜一下,估计是wasd按的数量不足导致的,就是金币必须吃足,而且做到每吃一个金币,level都会提升,那就把v82取反即可。
但这样的速度还是太慢了,而且要是做到最后每录像就得重做,emmm
那就得让金币每走一步都能吃到
即不管怎么走,都能走到LABEL17里面。要达成这个目的两个判断条件取反即可
这样,只要狂按wasd,就能快速得到正确的flag
结语
由于没有key patch插件,需要鼠标手动patch,在Edit->Patch Program->Change bytes手动修改机器码
不知道机器码的,可以在这在线汇编生成器上找到提示
Online Assembler and Disassembler
为数不多有大收获的逆向题目,争取下一次配置好IDA远程调试的环境