【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也是只给了一个答案,这次自己逆向把它搞定了,也可以说自己“会做”这道题了。
像这种没有加壳的程序,可以先通过OD直接查找对应的字符串,然后再上IDA定位到对应的函数
采用动态调试和静态调试相结合的方式效率更高{:301_978:} 复现成功啦!!!
嘿嘿我用的matlab:
ASCII对照表:
感谢分享,猫猫已经被玩坏了 感谢分享,这几天都在玩猫啊 厉害,学习学习 厉害学习学习了 ``` 感谢分享 学习了 感谢分享 好。支持楼主 感谢分享 学习了