解決策
2021年1月、『ペーパーマリオ』のRTA走者Morpheusは、ライブ配信中に不可解なゲームクラッシュに遭遇した。コミュニティはその原因を「エフェクトマトリックス」に突き止めた。これはハンマーの煙などの視覚効果の詳細を格納するデータ構造で、通常は一時的な効果を恒久的に保存してしまうメニューの不具合を利用すると、プレイヤーはマトリックスを無関係なメモリ領域へオーバーフローさせることができ、本体はそれをゴミの機械語コードとして実行してしまう。
そのクラッシュを有用なコードに変えるには、マリオの3D座標がマトリックス内の正確なオフセットに着地するよう極めて精密に位置取りする必要があった。これは過酷な課題だった。重力が彼の垂直位置を制約するからだ。2月中旬までに、走者Frayが位置の計算を済ませ、エミュレーションツールでコード実行を実証した。その数日後、Rainがこれまでのどのバグ走法よりも速くクレジットまでワープする完全なツール支援RTA(TAS)を公開した。しかしその位置取りは人間の能力を超えていた。そこで『時のオカリナ』の出番となる。
配信者JCogはその要となる仕組みを説明した。「あのアイドルタイマーを0x810から0x81fの範囲、つまり69秒に到達させてから保存した効果を解放すると、実行は拡張パックのメモリにジャンプします。『ペーパーマリオ』はそこを使っていません」。秘訣は、既存の『時のオカリナ』のACE手法——有名なアーウィン挿入グリッチと同じ系統で、注意深く構成したファイル名を使って2回繰り返す——を用いて、選んだアセンブリ命令をまずその拡張パックのメモリに読み込むことだった。
最後の要素はハードウェアの癖だ。初期のN64は電源を切った後も数秒間拡張パックのRAMを保持する。これはRareが断念したクロスカートリッジ解除システム「ストップン・スウォップ」の背景にあったのと同じ特異性である。『時のオカリナ』をプレイして命令を仕込み、電源を切り、『ペーパーマリオ』へホットスワップすると、そのオーバーフローが今や自分のコードを含むメモリへジャンプする。どちらのゲームも公式には拡張パックを使っていない。両者が協力して、それを実行チャネルに変えたのだ。
達成したこと
2つのゲームが攻撃において協調できる。一方のゲームが拡張パックのRAMに機械語コードを仕込み、カートリッジのホットスワップがもう一方のゲームでそのコードへ実行を引き渡す。
なぜ機能したか
それは3つの独立した欠陥——エフェクトマトリックスのオーバーフロー、2つ目のゲームのACE書き込み、電源オフ後のRAM永続性——を組み合わせ、誰も想定していなかったクロスカートリッジ攻撃へと仕立てた。
アイドルタイマーの仕掛けは、人間には不可能な精度要件を待ち時間へと変換し、このエクスプロイトを実機で概念上実行可能なものにした。
それは1990年代に中止された機能であるストップン・スウォップを、20年を経て攻撃用のプリミティブとして復活させた。
発見はコミュニティ内で順を追って進んだ。ある走者の偶発的なクラッシュ、別の走者の計算、3人目のTAS、そして配信者によるメモリマップの説明である。
応用できること
攻撃面は組み合わさる。一方のゲームのバグ、もう一方のゲームの書き込みプリミティブ、そして両者の間で消去されないハードウェア状態が合わさると、単一の要素だけでは露呈しない任意コード実行になり得る。
その後
Rainのツール支援走行は、人間が実行可能な最速のバグ走法よりも速く『ペーパーマリオ』をクレジットまで直接ワープさせた。Ars Technicaの記事はこの手法をTASの記録更新と位置づけた。必要な位置精度のため、リアルタイムでの人間による実行は依然として手の届かないものだ。
出典をたどる
出典
- How to beat Paper Mario really fast by... playing Ocarina of Time? Ars Technica · arstechnica.com ·