记一道攻防世界上的Reverse-gametime

发布时间 2023-12-26 16:44:42作者: 张伟文

一、题目描述

把文件下载下来,运行后发现是一个简单的小游戏,属于那种玩通关了就给 flag 的,自己先玩了一下,玩了一下大概游戏规则就是看到 s 就按空格,遇到 x 就按x,遇到 m 就按m,但是玩到后面速度非常快,如果你足够厉害,玩到后面应该是可以玩出来的。这里我们就要IDA进行静态分析,又是小游戏,所以也需要ollydbg进行动态调试。

二、解题环境

(1)解题所采用的的是windows11家庭中文版的操作系统

(2)编程语言为C语言

(3)用到的软件:exeinfope.exeIDA(32)以及IDA里面的F5插件 , x32dbg动态调试软件

三、解题思路

第一步:

gametime.exe放到exeinfope.exe查看一下gametime的一些基本信息

上面显示是一个32位无壳的程序,然后运行一下,发现是一个小游戏:

第二步:

gametime.exe放进32位的IDA里面利用F5的插件查看反汇编代码

往下走:

这里是我们跟进去游戏规则sub_401435函数里面来查看一下

查看一下sub_401260判断函数对应的汇编语言及重要跳转函数的地址

分析到这里,我们能清楚的了解到了gametime的第一部分,介绍三个游戏规则看见's'按空格键,看见'x'按'x'键,看见'm'按'm'将,的整个流程及一个很重要的判断函数

.text:004014D6                 pop     edi
.text:004014D7                 pop     esi
.text:004014D8                 pop     ebx
.text:004014D9                 test    al, al
.text:004014DB                 jnz     short loc_401503 //这里到后面进行动态调试时需要进行修改让他直接进行跳转

我们继续往下面分析:

到这里我们可以又分析到一个重要的判断函数:

我们继续跟进去到sub_401507函数里面查看一下,发现与上一个判断函数有一点变化,但是整体的思路没有变化,还是先找判断函数,这里有6次判断,自己动态调试着玩了一下,完成这6次后,后面还有说明这是试玩的6次

查看一下sub_401260判断函数对应的汇编代码及重要跳转函数的地址:

分析到这里我们了解到了这里是gametime的第二部分介绍完规则之后又让你试玩6次,也发现了另一个重要的跳转函数:

.text:0040155E                 pop     edi
.text:0040155F                 pop     esi
.text:00401560                 pop     ebx
.text:00401561                 test    al, al
.text:00401563                 jnz     short loc_401586 //这里到动态调试时可能不止修改一次判断函数,要修改到两个判断函数

我们继续往下面分析:

这里是我们跟进去到当v19=10时跳转到LABEL_41里面调用的sub_4012F6()函数里面查看一下

静态分析到这里,上面算是整个游戏的第三部分正式玩10次,我们可以很清楚的了解到了这个游戏的整个流程,当你完成3次游戏规则介绍,6次的试玩,正式玩成功10次后,第20次就能拿到flag,在这个静态分析里面有两个重要的判断函数,第一个是介绍规则时的判断函数,第二个是试玩和正式玩的时候的一个判断函数,分析到这里我们就需要用x32位的dbg来进行动态调试,找到这两个重要的判断函数的位置进行设置断点调试,检验和修改,让它进行无条件跳转直接跳转。

第三步:

我们进去到x32为dbg来进行动态调试gametime.exe进去之后按下F9:

去找我们静态分析时找到的两个重要的判断函数地址,虽然动态调试时的地址与静态分析的地址有一小点不一样,但是最后四位地址是一样的,我们依照后四位是找一下动态调试里面对应的地址:

.text:004014DB                 jnz     short loc_401503  //第一个判断函数
.text:00401563                 jnz     short loc_401586  //第二个判断函数

找到之后分别进行设置断点跑一下来检验我们的想法是否正确:

第一个判断函数设置断点:

第二个判断函数设置断点:

通过跑了一下发现我们的想法是正确,现在就只需要对这两个判断函数进行修改,让其判断我们输入的是什么都无条件跳转


这样修改完成后,我们F9跑一下gametime.exe,看一下结果和我们预想的是否一样

四、解题结果

跑下来和我们想的一样,到判断输入的是否正确时就直接无条件跳转了继续往下走:

介绍规则的3次:

试玩的6次:

正式玩成功的10次,第11次就出flag了

最终和我们想的一样第20次就出flag:

flag:no5c30416d6cf52638460377995c6a8cf5

五,总结:

完成这个实验后又积累到了一些经验,遇到玩游戏的题一定要先看懂了是如何玩,玩懂了对整个的思路想法还是有一点帮助,进行静态分析时代码太长的话我们可以整体看一下,重点分析一下关键的代码,游戏题玩起来很困难的话可以动态调试着下断点来玩,来慢慢摸索里面的思路从而找到关键的信息,还有一定要严谨,你后面分析的每一步都要在你前面分析出的找到对应的依据,不能凭个人感觉,这样即使可能结果没跑出来,但是你可以根据你的依据反堆回去查找错误!