2021 年 1 月,《紙片瑪利歐》競速玩家 Morpheus 在直播途中偶然遇到一次神祕的遊戲當機。社群追查後發現問題出在「效果矩陣」——一個儲存錘子煙霧等視覺效果細節的資料結構:透過某個選單漏洞,玩家能讓原本暫時性的效果被永久保存,進而讓矩陣溢位到無關的記憶體,主機便將其當作垃圾機器碼執行。

要把那次當機轉化為有用的程式碼,必須把瑪利歐的位置擺得極其精準,讓他的 3D 座標恰好落在矩陣中的特定偏移量——這極為困難,因為重力會限制他的垂直位置。到了 2 月中旬,跑者 Fray 完成了位置計算,並用模擬工具展示了程式碼執行;幾天後,Rain 發表了一段完整的工具輔助競速(TAS),比以往任何漏洞路線都更快跳轉到工作人員名單。但這種定位精度超出人類能力——而這正是《時之笛》登場的地方。

實況主 JCog 解釋了關鍵環節:溢位發生時,執行流程恰好會跳到玩家旗標與閒置計時器附近。「如果我們讓那個閒置計時器達到 0x810 到 0x81f 之間,也就是 69 秒,再釋放儲存的效果,執行流程就會跳到擴充 pak 記憶體,而《紙片瑪利歐》並不會用到那裡。」訣竅在於:先利用既有的《時之笛》ACE 手法——與著名的 Arwing 插入漏洞同屬一類,以精心建構的檔案名稱重複兩次——把選定的組合語言指令載入該擴充 pak 記憶體。

最後一項要素是硬體怪癖:早期 N64 在關機後會讓擴充 pak 的 RAM 再存活幾秒——這正是 Rare 已放棄的「Stop n' Swop」跨卡匣解鎖系統背後的同一項特性。遊玩《時之笛》、植入指令、關機、熱插拔到《紙片瑪利歐》,它的溢位就會跳進如今含有你程式碼的記憶體。兩款遊戲都未正式使用擴充 pak;它們合力把它變成了一條執行通道。

兩款遊戲可以合作發動攻擊:一款遊戲在擴充 pak 的 RAM 中植入機器碼,再透過熱插拔卡匣,讓另一款遊戲把執行流程交給它。

它把三個各自獨立的缺陷——效果矩陣溢位、另一款遊戲的 ACE 寫入,以及關機後的 RAM 持續性——組合成一場無人曾設計防範的跨卡匣攻擊。

閒置計時器的技巧,把人類不可能達到的精準度要求轉化為一段等待計時,使這個漏洞利用在概念上得以在真實硬體上執行。

它讓 Stop n' Swop——一項 1990 年代被取消的功能——在二十年後以攻擊原語的形式重生。

發現過程是社群接力完成的:一位跑者意外當機、另一位算出數學、第三位做出 TAS,還有一位實況主解釋記憶體映射。

攻擊面會相互組合:一款遊戲的漏洞、另一款遊戲的寫入原語,以及兩者之間未清理的硬體狀態,加起來可能構成任何單一元件都無法單獨暴露的任意程式碼執行。

Rain 的工具輔助競速直接把《紙片瑪利歐》跳轉到工作人員名單,比任何人類可行的最快漏洞路線都更快。Ars Technica 的報導將此方法定位為 TAS 的紀錄刷新;由於所需的位置精準度,即時的人類執行仍遙不可及。

追溯依據

參考來源

  1. How to beat Paper Mario really fast by... playing Ocarina of Time? Ars Technica · arstechnica.com ·