加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
不知道之前大家有没有想过修改游戏存档就能拿到游戏内shellcode的可能,
最近在玩了一段时间mugen之后才考虑到这个问题,mugen中有大牛通过人物包文件的溢出来对mugen程序进攻击,执行人物包内定义的代码,如果换成RGSS,有没有可能呢。
研究了一天之后,咱这里发现了一个奇妙的溢出攻击点。
当文件名过长(超过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个字节,但是写个短跳就可以跳入大量可写字节范围内,不多赘述。
初步尝试:
fux2 = File.open("str.txt","rb").read #p File.open(fux2){} Bitmap.new(fux2)
fux2 = File.open("str.txt","rb").read
#p File.open(fux2){}
Bitmap.new(fux2)
成功执行自定义代码。
想来写入存档也是没什么问题的,怕是又是全新的黑科技(x
要问有什么用的话,可能真的没用吧23333,就是好玩
“求大佬发一个XXX存档“
“来,这个给你”
什么?东西呢?没有东西,不满足伸手党,有兴趣看看,没兴趣笑笑 |