Project1

标题: 通过修改游戏存档对游戏进行攻击,从Bitmap.new到shellcode [打印本页]

作者: fux2    时间: 2018-6-29 14:15
标题: 通过修改游戏存档对游戏进行攻击,从Bitmap.new到shellcode
不知道之前大家有没有想过修改游戏存档就能拿到游戏内shellcode的可能,

最近在玩了一段时间mugen之后才考虑到这个问题,mugen中有大牛通过人物包文件的溢出来对mugen程序进攻击,执行人物包内定义的代码,如果换成RGSS,有没有可能呢。

研究了一天之后,咱这里发现了一个奇妙的溢出攻击点。

RUBY 代码复制
  1. Bitmap.new(超长文件名)


当文件名过长(超过260字节)时,RGSS程序(我用的XP做实验)会产生内存访问异常,并且异常地址位于
new出来的文件名内,这样一来,我们只要通过修改游戏存档中人物的character_name之类,能影响Bitmap参数的字符串就可以达到溢出的效果了。

溢出有了,那么攻击点是否存在呢?



经过调试之后,发现访问异常发生在rgss103j.dll+0x298D2,
简单分析之后,这里的逻辑大概是处理链式数据的地方,当最上面的edi为0时终止循环,且第一次edi不能为0(不在这个文件名内)


这里没有发现可以攻击的地方,所以先写入合理数据让程序继续运行。
如图,我们通过修改这个文件名内相应的位置(我这是读取文件内的字符串,要是直接放进脚本需要转成\xXX的格式)
就可以决定esi的值,使其终止处理(假装处理完毕)并继续执行。

由于此时堆栈被大量破坏,后面是一定不可能正常运行的,在ntdll的RltUnwind函数中再次发生访问异常,



而此时的ecx依然在文件名范围内,这样就拿到一个任意call,但由于文件名字符串在内存中的位置不固定,这里就肯定不能直接写文件名的内存地址。



翻一翻堆栈,不出所料附近依然有文件名内的内容,这样我们只要跳转到任何一个
非game.exe、内存起始地址小于ntdll区域的retn 0x4时
就可以让程序跑进这4个字节的代码区域,虽然只有4个字节,但是写个短跳就可以跳入大量可写字节范围内,不多赘述。

初步尝试:
RUBY 代码复制
  1. fux2 = File.open("str.txt","rb").read
  2. #p File.open(fux2){}
  3. Bitmap.new(fux2)


成功执行自定义代码。

想来写入存档也是没什么问题的,怕是又是全新的黑科技(x
要问有什么用的话,可能真的没用吧23333,就是好玩

“求大佬发一个XXX存档“
“来,这个给你”


什么?东西呢?没有东西,不满足伸手党,有兴趣看看,没兴趣笑笑
作者: 灯笼菜刀王    时间: 2018-6-29 15:49
一脸懵逼进来, 一脸懵逼出去
作者: IamI    时间: 2018-6-29 18:44
总而言之被触瞎
作者: MireniamuYuki    时间: 2018-6-29 19:45
虽然看不懂,但是我已经被醋虾了。
作者: 梦想家大魔王    时间: 2018-6-29 21:37
所以玩游戏千万不要用别人的存档。
作者: KB.Driver    时间: 2018-6-30 01:05
想起今天看到知乎上讲的图标炸弹了……
大概是类似的原理?
作者: fux2    时间: 2018-6-30 08:34
KB.Driver 发表于 2018-6-30 01:05
想起今天看到知乎上讲的图标炸弹了……
大概是类似的原理?

这可说不准,没研究过不一定是同一种情况啦,不过利用修改输入数据进行攻击一般都是溢出攻击的一种辣。
作者: 水镜雨萱    时间: 2018-6-30 21:55
溢出攻击……服了
话说咱对着源码跑程序5分钟就开始烦了……就更别提汇编了……果然一旦爱好变成任务就立刻凉凉……

不过“修改存档”这攻击场景似乎有点苛刻哈,为啥要在存档里写字符串呢?

作者: 斜眼君    时间: 2018-7-1 23:14
举报楼主太醋,我都瞎了,我这段字都是盲打的
作者: 迷糊的安安    时间: 2018-7-1 23:23
很久以前网游『仙境传说RO』的客户端里似乎也有一样的问题,玩家传一个特殊的bmp当作公会图标,就可以让所有看到该图标的玩家跳错退出游戏。而自己可以通过锁缓存的方式来不跳错,于是团战一夫当关万夫莫开……
作者: 浮云半仙    时间: 2018-7-1 23:29
说得好我很听话每次都用比如sprintf_s之类的

黄鸡叔叔醋瞎啦
作者: chd114    时间: 2018-7-6 18:36
那前两天传出来的微信支付漏洞也是类似的原理吗?
作者: duzine    时间: 2018-8-14 11:33
這就叫技術宅毀天滅地嗎?
作者: v2sam    时间: 2018-8-14 13:27
那么再来一份:通过读取存档对游戏进行修复。
作者: oott123    时间: 2018-8-17 18:57
听起来有道理,不过利用条件稍微有点苛刻呢……
RGSS 本身都是 ruby 跑的,(假设 ruby 解释器本身没有什么问题)利用点也就为数不多 RM 自己用 C 实现的部分,感觉能玩的也不太多的样子……
作者: fux2    时间: 2018-8-17 20:06
oott123 发表于 2018-8-17 18:57
听起来有道理,不过利用条件稍微有点苛刻呢……
RGSS 本身都是 ruby 跑的,(假设 ruby 解释器本身没有什么 ...


当然不能做到像mugen那么活,因为我也不知道怎么修复被破坏的那些堆栈。
所以执行完存档里塞的代码以后游戏必然挂掉。
主要的作用是仅仅传播存档就可以执行任意代码,那么做一些病毒才能做的事情也不是不可以的。
作者: 有丘直方    时间: 2018-8-22 22:06
想起来@柳之一 的Bitmap的Marshal支持脚本,印象中里面重写了marshal_load方法
我们把进行攻击需要的语句放在marshal_load方法里面,然后把经过改造的对象扔到rxdata里面,这样玩家读取的时候就会执行攻击语句,从而受到攻击
没测试过,或许可以




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1