
近年注目される「任意コード実行を使ったゲームの高速クリア」 74
ストーリー by hylom
脆弱性を付いたアタック 部門より
脆弱性を付いたアタック 部門より
あるAnonymous Coward 曰く、
動画共有サイトなどでは、ゲームをいかに短時間でクリアするかにチャレンジしている動画が多く公開されている。これらは「TAS」と呼ばれているが、最近は「任意コード実行(ACE)」と呼ばれる手法を使った超短時間でのゲームクリアが注目されているらしい(ロックマン1のディレイエンディングTASについて:FinalFighterのブロマガ)。
任意コード実行とは、ゲームのバグや不具合を利用して通常は実行されるはずのないコードを実行させることで、通常実行できないようなプレイを行うというテクニック。先の記事では、ファミコン版のロックマン1で、画面上に存在する見えないオブジェクトを利用してメモリバンク切り替え処理に不具合を生じさせ、かつオブジェクトに対する処理を実行するプログラムのアドレスをコントローラから特定の入力を行うことで操作し、ゲームのエンディング部分のプログラムを呼び出すという手法が解説されている。
今回のTASプレイは数年にわたって研究を行った末に完成したとのことで、プレイ中のメモリ内容の観察や多くの試行錯誤を経て成功したようだ。
実質2週間 (スコア:5, 参考になる)
> 今回のTASプレイは数年にわたって研究を行った末に完成した
「ロックマンのTAS」そのものは数年にわたって探求を続けているようですが、
今回の「任意コード実行によるエンディング到達」については、
> 2014/4/29 SMB3の任意コード実行の機構を知る
> 2014/5/13 ついにわれわれは感動のエンディングを見ることができた
というわけで、実質2週間で完成させてますね。
これまでに発見済の内容:
・ロックマンには、(処理落ちしているなどの要因で)ごく特定のクリティカルなタイミングで割り込みが発生すると、(メモリのバンク切替を間違えて)変なオブジェクト番号の物体が画面に現れるバグがある。
(これが今回使用した唯一のバグ。このバグそのものは2011年に発見していた)
・ロックマンのコード処理では、オブジェクト番号に基づいたジャンプテーブルでオブジェクトの挙動制御ルーチンを切り替えている
(そのため、変なオブジェクト番号の物体を登場させた場合、通常は単に「暴走」していた)
今回の新技:
・上述のバグでプレイ操作で制御可能なメモリ部分にジャンプするようなオブジェクト番号を持つ物体を発生させるようなタイミングを模索する。
・オブジェクトが発生する丁度のタイミングで、メモリに内容が「エンディングルーチンにジャンプする」処理になるように、プレイを調整する
というわけで、具体的には、
・目的のオブジェクト番号(55)のオブジェクトが発生するタイミング(時刻1929F)で割り込みが発生するように、ラグフレームを増やしたり、セレクトでメモリの数値調整を行ったりといった操作を行う。(そうなるような操作内容の探索が今回のプレイ実現への最大の難関だったようです。)
・そのタイミングで、ロックマンのY座標=54に、ロックバスター1番目と2番目のY座標=50と4Dになるよう調整(これによりレジスタが書き換えられ、ステージクリアルーチン実行時の「ステージ番号」判定が10になり、下記メモリのルーチンにジャンプするようになる)
・そのタイミングで、1コンの「左下」+2コンの「左右セレクト」を押す。(これにより、コントローラの状態を示すメモリが、「ステージクリアルーチン」のアドレスである「C460h」になる)
・オブジェクト番号55のオブジェクト発生、55番のジャンプテーブル実行により、
・以上の処理により、「ステージ番号=10」として、「ステージクリアルーチン」にジャンプし、エンディングに到達
以上のように、あくまでタイミングと操作の調整だけですので、とんでもなく操作はシビアですが「無改造の実機ファミコンと無改造の実カートリッジ」でも、理屈の上では再現可能というという技です。
(エミュレータで実行してはいますが、「実機で再現可能」というのは「TAS」のシバリですね)
Re:実質2週間 (スコア:2)
だけど、「無改造の実機ファミコン」で「2コンの「左右セレクト」を押す」は無理では?
(十字キー割って左右両方押すか、分解してなんとかするか、少なくとも「無改造」は無理っぽい…?)
Re: (スコア:0)
ジョイスティックなんかに1P2P切り替え機能がついてるやつがあったんで、
ジョイスティック(2P)と IIコンでやればいけるんじゃないですかね。
つか、IIコンにはセレクトもないよね?
Re: (スコア:0)
方向キー同時押しはなぜかTASではOKにされる決まりのようです。
Re:実質2週間 (スコア:1)
意味だと思うんですよね。
で、共通コントローラの話は、セレクトボタンに関する突っ込みだと思うんだけど、そうじゃなくて、問題は「左右」の同時押しの方。
ファミコン(というか、殆どのゲーム機)のコントローラパッドの方向キーって、ABボタン等のように独立したボタンじゃなく、
上下左右で1枚の板状の部品になっていて、横から見るとシーソーのように、「右を押せば左が離れる」「左を押せば右が離れる」って
機構になっていた筈。
よって、無改造のコントローラでは、左右キーの同時入力は物理的に不可能じゃない?って話ですよ。
Re:実質2週間 (スコア:1)
そんなジョイスティックあったんですね。知りませんでした。
(何しろド田舎出身なもので…)
参考になります。
Re:実質2週間 (スコア:1)
ファミコンの1コン、2コンは確かに本体からケーブルで伸びてますが、ファミコンでは拡張コントローラ接続用の
外部コネクタが存在します(旧ファミコン、AV仕様ファミコンとも)
この外部コネクタに連射パッドなどのコントローラを接続すると、通常は1コンの代替として認識されます。
(希に3人用モードなどあるゲームの3コンにも使われた。また通常の1コンの入力はそのまま使用できるので、
方向キー左右押しとかが可能になるんですね)
#2602555や #2601745がいっているのは、この外部コネクタから接続して1コン2コンが切り替え可能なコントローラがある。
と言っているんですよ。(で、私はそのコントローラの存在を知らなかったので、1コンならともかく、2コンと外部コントローラで
方向キー同時押しが出来るとは思っていなかった)
あと、半田付け?とか書いていますが、本体にケーブルで繋がった1コン2コンは、基盤にコネクタで接続されているので、
裏蓋を外す必要がありますが、半田付け不要で交換可能です。
(昔は補修部品としてコントローラだけ買って、ユーザー自身で交換もできた)
Re:実質2週間 (スコア:1)
とりあえず、スーパーマリオのTAS実機再現ムービー [youtube.com]をどうぞ。
コントローラの代わりにArduinoを接続し、Arduinoからはリプレイデータを電子的に送り込むしくみです。
良いか悪いかはともかく (スコア:2)
見ていてくそも面白くない一発芸というのが最大の問題の様な……
スーパーマリオの場合 (スコア:1)
単にクリアするだけではなく、別のミニゲームを挿入するところまで行っちゃってます。
スーパーマリオワールドをクッパを倒さず謎のミニゲーム経由で爆速クリア [gigazine.net]
Re: (スコア:0)
動画では見たんですが、元々、仕込まれていたイースターエッグ的な謎のミニゲームをプレイしているもんだと思っていました。
メモリ書き換えクリアネタにしては、ジャンプするまでの謎の挙動が長いなとまでは思ったんですが、
メモリ書き換えのバグがあると言うことは、元々存在しないプログラムでも実行できると言うことを意味するわけで、
そこで延々、メモリ上に「プログラミング」をしてたんですね。
改めて感動しました(笑)。
Re: (スコア:0)
分かった!
ゲームセンターあらしの炎のコマも一見無駄な動きのように見えて、実はメモリを書き換えていたんだな!
Re: (スコア:0)
メモリ書き換えるのはエレクトリックサンダーですね。
Re: (スコア:0)
まさにマリオクラフト
ツールを使わずとも (スコア:1)
セレクトを押した時にメモリ上に格納されたバイナリデータが、ウィンドウを閉じてもリセットされないバグを利用してるらしいですね。
どうやって見つけんだこんなもん。
/.jで検索してもスラドが出ないからbingはダメなんだよ
Re: (スコア:0)
エミュレータで挙動をおっかけてみて発見するんじゃないかなあ…
Re:ツールを使わずとも (スコア:1)
ユーザのそういった操作を想定できないから私はデバッグが苦手
#ネットもあまり普及していなかったのに、周りのみんなが同じバグを知ってるってのもすごい話だよなー
/.jで検索してもスラドが出ないからbingはダメなんだよ
カノジョの本当の姿 (スコア:1)
世間じゃBOTだのツールだのと言われてるけど、
TASさんの本当の正体は超絶美少女プレイヤーなんでしょ。
Re: (スコア:0)
おっと、それ以上話すとあんたの人生が最短でクリアされちまうぜ
気をつけな
Re: (スコア:0)
ハッピーエンドならいいかも。
※「石の中にいる」(´・ω・`)
Re:カノジョの本当の姿 (スコア:1)
おきのどくですが
あなたのじんせいの
ぼうけんのしょは
きえてしまいました
そこまで書き換えるなら (スコア:1)
もうスタート直後にエンディングになるように書き換えるとかでもいい気がしないでもない。
Re: (スコア:0)
当然それがベストですよ。
問題はそれを「コントローラからの入力のみで」どうやってやるか。
Re: (スコア:0)
タイトル画面の表示なんて無駄。
電源入れたらすぐエンディングでいいじゃん。
Re: (スコア:0)
TAS (スコア:1)
は、Tool Assisted Speedrun(またはSuperplay)が語義ですが(一応)。
ここまでいくと、Tool to Assassinate Sanityとかなにか別のバクロニムを付けたくなりますね。
M-FalconSky (暑いか寒い)
高速クリア (スコア:1)
大昔TombRaider(シリーズ番号忘れた)でステージ序盤(たしかロンドン?)の屋根の上で
変則ジャンプすると本来行けないはずの屋根の反対側に行けてそこはもうステージゴール寸前ってのを思い出しました。
(謎解きゲームの過程を端折ってしまうので後からやり直しましたが)
TombRaiderでは他にも変則ジャンプネタはあっちこっちに有ったなあ・・・
たぶん3D-MAP上の位置判定ミスだろうから今回見たいなのとはバグの意味が違うと思うが
最近? (スコア:0)
そんなに新しくない気がするが俺の勘違いだろうか…?
Re: (スコア:0)
日本じゃバグ技と称して、もう廃れたってぐらい昔に流行ったよね。
なんで今頃、それも初代ファミコンソフトのプレイが話題になったんだろう。
Re: (スコア:0)
何か別のものと勘違いしてない?
できればその具体的なソフト名とかバグ技の内容とか書いてほしい。
Re: (スコア:0)
具体的にどんなことが行われていたんですか?
Re:最近? (スコア:1)
上のACが思ってるのとは違うかもしれんけど、
『マップ端から不正規のメモリ領域にアクセスしてデバッグモードに強制突入する』
とか、
『64個目の武器や防具を装備することで不正規のメモリ領域にアクセスしてゲーム内の任意メモリを書き換える』
とか、そういうの?
その手のバグ利用TASは、理論上実機再現可能とはいえ通常のクリア手順とあまりに違うので、
これまではわりと番外的なもの、という扱いだったのだけど、
これはこれでいろいろと詰めるところがあって面白いから、
最近は、そういうジャンルとして認められてきた。
みたいな印象。
Re: (スコア:0)
Re:最近? (スコア:1)
ACの人生を心配するACの心遣いを無視するのもあれだけど、
そういう大切な課程をすっとばしてエンディング見れちゃうのが今回の話題だから、
まあ、べつにいいんじゃね?
MOTHER 2とサガフロ2やね。
http://www.nicovideo.jp/watch/sm12072833 [nicovideo.jp]
http://www.nicovideo.jp/watch/sm19807859 [nicovideo.jp]
あたりが、解説が丁寧でとても面白い。
Re: (スコア:0)
TASにもバグ利用ありと利用なしがありまして、
今回の件はバグ利用ありTASの一部ですね。
たとえばSFCロマサガのホークの開始直後のレイディバグで、
乱数調整すると2分でエンディングにテレポートできるとか
ドラクエ3のランシールバグで乱数調整すると
ラダトームだったかゾーマ城だったかにテレポートするとかは
何年も前にyoutubeでみましたね。
Re: (スコア:0)
私はまったくそういう解釈をしていなかったので、どんな具体例が?と思って尋ねてみたのですが。
この記事で言う「任意のコードを実行」とはその程度の話なのでしょうか。
Re: (スコア:0)
TAS界隈では、バグ利用+メモリのアドレス利用って、悪魔城ドラキュラシリーズが有名だと思ってましたが
(「TAS 悪魔城」で検索すると、ジョン・カビラ解説付きが検索に引っかかる世の中)
Re: (スコア:0)
> この記事で言う「任意のコードを実行」とはその程度の話なのでしょうか。
そもそもあなたは前提を理解できていません。
レイディバグやランシールバグそのものは乱数調整とは違います。
バグにより本来想定されていない状態を作り出すことです。
そのうえで、各種操作やウェイトの調整で特定のメモリ上の値を目的に沿った値に調整する工程が発生します。
ここで調整対象になるメモリアドレスに格納されているものは
実行コードでも変数でもありえます。
それによりバグの結果が軽度から重度、ゲーム継続可能からフリーズや強制リセットまで多岐に渡ります。
既知の多くのバグ技において、
実行コードの部分が変更されたことによる結果だったというものがあるでしょうね。
結局、メモリの内容を特定の状態にしたうえで、特定の処理を起こして目的を達成してるだけです。
Re: (スコア:0)
それらはせいぜい「任意アドレスへのジャンプ」しか出来ないんじゃないかな。
レイディバグやランシールバグで任意コードの書き込み、つまり「コーディング」って出来るの?
Re: (スコア:0)
数万回試行して引き当てた動画は見たことあるけど
ともあれそれは乱数調整使う普通のバグありTASだと思うが
Re: (スコア:0)
> ともあれそれは乱数調整使う普通のバグありTASだと思うが
レイディバグのなんでもありな結果を見ればわかる通り、
変数の調整だけでなく明らかに実行コードも影響範囲に入ってますね。
いきなりエンディングはわりと頻度が高いらしく、
「よくある結果」のうちの一つのようです。
毎回メモリの状況を記録しながら思考させていれば
どんなメモリ状態になったときにエンディングになるかもわかるでしょうし、
解析結果としての動画も作れるでしょうね。
やる人がいるかどうかだけの問題でしょう。
Re: (スコア:0)
コードを実行してEDまで持っていくという再現性100%のゲームクリア(TAS)に利用されてきた事例がなかったのなら
「ACEに使えそうなバグが既知である」だけであって「ACEを使ったTASが古くからある」わけではないでしょう
当り判定のバイパスとか (スコア:0)
シューティングならば、
自機数をふやすとか、
自機被弾当たり判定のバイパスとか、
先のステージを見たいがためにやったことありますが
古くはPC-8001の某ゲームで
#ええ、おっさんです。
極論 (スコア:0)
TASとは違うけど、将棋が棋士vs電脳で盛り上がってるこのご時世にあって
古いゲームなんかはゲーム機vs電脳で勝負させることもやろうとすれば、できるんじゃないかと考えてしまう
もちろんロジックでの勝負ではなく、たとえばインベーダーゲームだったら、ディスプレイ画面をカメラで撮影して認証技術を用いての反撃とか
先日、養老孟司がテレビのなかで今の戦争なんてゲームみたいなものなんだから
お互いの国同士がゲームで決着つければいい話しって言い切ってたのが印象的
Re:極論 (スコア:1)
こんな風に膠着したら嫌かも
http://park10.wakwak.com/~imustak/st/tos/23.htm [wakwak.com]
Re:極論 (スコア:1)
>先日、養老孟司がテレビのなかで今の戦争なんてゲームみたいなものなんだから
ベトナム v.s. 中国 だとリアルに血なまぐさくてゲームっぽくは見えないっすね。
#進撃の巨中国
Re:極論 (スコア:1)
Gガン…
Re: (スコア:0)
認証技術ではなく認識技術です
すんません
Re: (スコア:0)
「遺伝的アルゴリズム グラディウス」でググって。
Re: (スコア:0)
昔ぷよぷよを自動プレイさせるデモを見たことがある。
コンピュータ上でスーパーファミコンの画面(実機かエミュか覚えていない)を動画かかなり早い間隔の静止画でとりこんで、それを画像認識し、コントローラ経由で自動プレー
もう十年以上前の気がする
#ぐぐってみたけど、みつからなかった