admin 發表於 2023-8-25 14:06:31

實現電子遊戲ACE(Arbitrary Code Execution)的具體原理是什麼?

正好昨天看了《超等马里奥世界》(SMW)的一個肆意代码履行 TAS 直接通關乃至玩小遊戲,献上道理。下面是 AGDQ2014 上的演示视治療神經性耳鳴,频,現場演示是用 Raspberry Pi 输入 SFC 真機完成的。

起首 SMW 可以操纵 bug(彷佛是吃到存放的物品的同時耀西吐舌頭?)去刷肆意 id 的物體(Sprite),在某些环境下可以刷编號為 0xFA 的物體。SMW 刷物體的時辰會按照物體的 ID 履行一段代汽車補漆筆,码,而 0xFA 的代码位於……显存……(地點是 $0322)

因而便可以操纵操作给显存中填入特定的数值(固然為了填充這個数值做了不少操作)。接着刷一個 0xFA,CPU 起頭测驗考试履行显存中的数据,而以前把持的成果是把它填上了 4C 18 42,即 JMP $4218,這個跳轉會跳轉到……手柄對應的内存。(超任利用 MMIO,读手柄状况就是读取内存。)

因而紧接下来你便可以用手柄来直接输入代码了。

恶魔城月下這款遊戲我没玩過,看了一下视频感受道理很類似(若是不合错误请指出)

應當是:物品栏缓冲區溢出

然後物品栏的内存数据四周又正好有函数指针或一些關頭数据指针(好比下個舆圖数据指针)

简略来讲,比方:

物品栏有20個位置占用内存0-19位置,一共20 byte,起頭地點為0x10,然後接下来1 byte是玩家遭到進犯的危险计较的函数指针,位於0x24,随着4 byte當前舆圖的4個標的目的門通往的下一個舆圖的指针.

若是能找到一些bug讓物品放到物品栏外,好比卡bug把物品卡到第21個空地,那末現實上物品栏接下来的1 byte位置上的函数指针的地點被溢出改写為了该物品的数据.或是肆意其他bug或法子能改写位於0x24的数据(但這個進程中心可能會很繁杂).

若是你無煙煎烤鍋,成心找一個物品它的数据正好是0x10(好比正好是生命复兴水甚麼的)卡進去,這時辰的你事前已往物品栏里塞了一些精心機關的物品序列,其對應的数据是可履行的代码,好比正好是直接改写遊戲状况到通關.這一個物品序列的数据位於0x10.最後你去挨一下打,遊戲挪用位於0x24的函数指针,但是它已被溢出的物品改写為了0x10,好~直接跳轉到0x10履行特地機關通關函数,遊戲通關了.

這里有Pokemon Yellow物品栏溢出Arbitrary code execution的POC(proof of concept)可以参考一下:
頁: [1]
查看完整版本: 實現電子遊戲ACE(Arbitrary Code Execution)的具體原理是什麼?