HzHappy 发表于 2021-3-22 21:04

【MISC-快乐游戏题】用52的方式来解决抓猫游戏

原始题目地址:https://adworld.xctf.org.cn/task/answer?type=misc&id=5554
这是一道UNCTF的misc签到题,下载的压缩包里是一个应用程序,据说“玩游戏就能得到flag”。
在随便把玩了一会儿后,迫于时间的想法我实在没有动力继续耗下去。但是游戏失败时有个提示。


一个弹框?我首先想到的是以前学习VB6的时候经常用到的MessageBox函数,而win32中有一个功能相似的API函数,叫作MessageBoxA。


拖入DIE查壳,32位的可执行程序,没有壳。
直接拖入IDA中,选中“Import”寻找程序的导入表,然后排序并定位到MessageBoxA函数。

然后,我一开始的想法是在这个API上下断,查找到底是什么函数在试图调用这个API。
一开始界面没显示的时候,就会断在这里一次,不管它。
第二次就是游戏失败的时候,断在了这里。


这里是一个函数的入口,因此当前的ESP指向了MessageBoxA执行完后要执行的下一条语句,“sub_405810+DD”。
从这条语句往上追码,然后我看到了一个“信息”的offset,我有预感这就是重要函数。


然后我就去让IDA把所有进入该函数的父函数都列出来。

然后我一个个地找到调用该函数的父函数进行调试,具体方法是在“sub_405810+DD”的这一条语句下断,然后找到调用sub_405810函数的地方,从参数传递链起点处设置为EIP,然后执行,看结果。
以下为了方便我把sub_405810函数重命名为MessageBox。

第一个函数是sub_40485C,我找到该函数后把0x40485F设置为EIP。(红条为EIP点)

然后把我屏幕黑了3秒还告诉我只黑我三秒,由此可见这应该是一个反调试函数。

第二个函数是sub_403E5D,这个函数的汇编太长,转成伪代码后发现是一大堆数学计算,然后我在函数的最底下发现了调用MessageBox函数的可读部分。

“游戏结束”,说不定也有赢的游戏结束呢?

结果让我大失所望,特别是里面还有反调试函数,我直接就认为这个函数就是为了反调试而设计的。
第三个函数是sub_402ADD,汇编代码实在是太长了,转成伪代码后发现了几个关键字。

既然这里有了“恭喜你”的字样,那么说不定我要的flag就在这里?

然后往上找到了一大串MessageBox函数。。。


如此频繁地调用,调用的参数又全是数字,然后看数字很像是ASCII编码。我有一个大胆的想法!

a =
for i in a:
    print(chr(i), end='')
flag:UNCTF{c783910550de39816d1de0f103b0ae32}
网络上的WP大多都是给了一个答案就省事了,我去看XCTF的WP也是只给了一个答案,这次自己逆向把它搞定了,也可以说自己“会做”这道题了。

lyl610abc 发表于 2021-3-23 14:06

像这种没有加壳的程序,可以先通过OD直接查找对应的字符串,然后再上IDA定位到对应的函数

采用动态调试和静态调试相结合的方式效率更高{:301_978:}

Abstinent 发表于 2021-3-23 01:35

复现成功啦!!!

嘿嘿我用的matlab:

ASCII对照表:

vethenc 发表于 2021-3-22 21:31

感谢分享,猫猫已经被玩坏了

简简单单。 发表于 2021-3-22 22:12

感谢分享,这几天都在玩猫啊

Mr.Raindrop 发表于 2021-3-22 22:18

厉害,学习学习

tan567421 发表于 2021-3-22 23:07

厉害学习学习了 ```

lumos_ 发表于 2021-3-22 23:46

感谢分享 学习了

mr_66 发表于 2021-3-23 08:26

感谢分享

Mdr 发表于 2021-3-23 08:26

好。支持楼主

whngomj 发表于 2021-3-23 08:39

感谢分享 学习了
页: [1] 2 3 4
查看完整版本: 【MISC-快乐游戏题】用52的方式来解决抓猫游戏