Gametime
这是一道有趣的游戏题,运行程序,它会先跟你介绍规则,如果看到s的话就按空格键,如果看到x的话就按x键,如果看到m的话就按m键,如果手速够快的话可以通过玩游戏通关,作为一道逆向题的话我用了两种作法
做法一:动态调试,我用的工具为x32dbg,这里也是学习了别人的思路
“通过刚刚玩游戏发现程序有输入的地方,那么我们猜测这个题的做法:F8的时候程序一定会在某个地方停住,下断点,重新载入,F9,在下断点的地方按F7,进入跟踪,然后F8……,一直循环,直到发现有用的函数。”
程序载入x32dbg
F8单步走,走到不能动的地方下断点
Ctrl+F2重新载入,F9,然后F7进入函数
然后一直F8走到不能动的地方,再下一个断点
再重新载入,F9到下的第一个断点处,现在我们可以把这里的断点去掉了。然后F9到第二个断点处。
重复上面的操作,直到找到输出s的函数,如下
执行call gametime.301260时,程序会输出s,并检测输入,如果输入空格,则当程序执行完test al,al,ZF标志位会置1,下一条jne指令就会跳转,如果输入错误就会跳转失败,继续执行就会输出错误语句,当然,我们可以随便输入,只要在执行jne语句前手动将ZF标志位置1即可
上图为练习环节的关键函数,调试程序就会发现无论是输出s还是x,m,都是通过调用gametime.301260函数实现的,都会跳转到上图下断点的指令
这段是正式游戏阶段的关键函数,可以看到,还是调用了gametime.301260函数,不过指令的地址不同,通过在这两个位置下断点,不断运行并保证jne跳转始终执行就能得到最终的flag
方法二:patch程序
引用官方wp(直呼学到了)
将下图中的jne改为je(另外一处做相同操作),再Apply patches to input file,再执行程序,只要错误输入或不输入就能得到正确的flag