xorloser’s blogで、Gehotz氏のPS3 exploitチュートリアル:ソフトウェア編に続きハードウェア編が公開されていました。【情報源:xorloser’s blog】
ブログの文字数制限につき翻訳のみでお伝えします。
PS3 Exploit: ハードウェア
この記事はPS3 hypervisorのメモリアクセスexploitに必要なハードウェアに関する記事です。ハードウェアの目的は変わってほしくない値をPS3が保存しないようにすることです。PS3は値に変化があるとその値をRAMに書き込みます。そのため変化した値の書き込みを止めるために書き込みすることを止めてやる必要があります。
PS3はコントロールライン経由でRAMに対し書き込みコマンドを送ります。ですのでコマンドが送られた時にコントロールラインでそれを阻止しなければなりません。必要なのはPS3に正常にRAMへ書き込めたと思わせることですが、RAMはコマンド受信を阻止されているので実際にはコマンドを受け取っていません。そのため書き込み動作は行わないことになります。
コントロールラインでコマンドを阻止する最も簡単な(比較的安全でもある)方法はグランドに落としてしまうことです。これはコントロールラインとグランドとを配線してしまえば済んでしまいます。厄介なのはタイミングを正確にとることで、そのタイミングさえ間違わなければ書き込みを任意に阻止でき、その前後では何も起こらず通常動作していることになります。本来これは高額な機器を投入して膨大な時間をかけないとできないはずですが、Geohotz氏は”幸運”という最も簡単な方法でこれをやってのけたようです。正確な書き込みコマンドのタイミングが現れる状況を幾度となく再現し、書き込みが行われないタイミングで起こるクラッシュが発生するまでコントロールラインをグランドに落とす作業を幾度となく繰り返さないとなりません。exploitはそれを確実に実行するためのトリガーとして機能します。
どうやって動作するかはもうお分かりですね。繋いだらグランドに落ちるようなコントロールラインの配線と、グランドに繋がった配線が必要です。更にこの2本の配線が瞬間的に接続されるようにしてやる必要があります。ただ、接続を手動でいくらがんばったところでどんなに速くてもミリセカンド単位です。しかしRAMコントロールラインの速度は非常に速く、1msの間にかなり大量のコマンドを阻止してしまいます。そのため手動ではなく、1回が非常に短い時間だけ繋がるようななんらかの機器を使ってやる必要があります。Geohotz氏は接続時間を40ns(ナノ秒)としています。
このようなごく短時間というのを実現できる機器は実は沢山あります。Geohotz氏の場合はFPGA基板を自作しています。555タイマーを使えばいいという人もいますが、それで成功したと言う話は聞いたことがありません。私の場合は以前あるプロジェクトで使っていた小さなsx28 microcontrollerを使いました。20nsの命令サイクルが50MHzで動作します。40nsで接続するだけなら十分な速度が出せます。
最初のステップは、マザーボードの表面にアクセスできるようにするためにPS3を分解するところからはじめます。PS3のバージョンごとに異なりますが、マザーボード上にある後述する場所を探します。
最初の写真は初期型60GBのHDDを搭載したPS3で、USBポートが4つありカードリーダーがついているバージョンです。レジスタのサイドにワイヤーをハンダ付けしているのが分かると思います。これがハンダ付けで配線が必要なPS3のRAMコントロールラインです。2本の電源プラグの出っぱりが左側にくるこの配線ルートの通りにワイアーを配置すると良いでしょう。写真ではワイヤーは下に伸びていますが、実はそうすることで偶然RAMが改変してしまう悪影響があることが分かりました。そうならないために配線ルートを電源プラグの裏の左側を通すようにし、PS3ケースの左側がらワイヤーを取り出すようにしてください。インストール時に長めのワイヤーを使っても構いませんが、最終的には設置完了後に短くしてください。ワイヤーはハンダ付けポイントが引っ張られることがないようホットボンドを使って配線を固定してあります。
2番目の写真は80GBのHDDを搭載したPS3で、USBポートが2つありカードリーダーがついていないバージョンです。このモデルはPS3″Slim”モデルが出る直前の”Fat”モデルです。それ以前のマザーボードのように片面に4つのRAMチップが載っているのとは異なり2つのRAMチップがマザーボードの両面に搭載されています。写真ではRAMコントロールライン接続のためのハンダ付けポイントに印をつけてあります。ここにハンダ付けするためにはクラフトナイフを使い注意して配線パターン表面を削りワイヤーがハンダ付けできるよう銅線をむき出しにしておく必要があります。ハンダでワイヤーを取り付けたらPS3の他のパーツに一番干渉しない直線ルートでケースの正面から取り出してください。初期型同様最終的にはワイヤーは短くなるよう処理してください。
次にグランド接続の作業をします。新旧どちらのマザーボードも同じ方法で簡単にできます。単にワイヤーを、マザーボード表面にあるメタルシールドにねじを切ってあるところに入っている金属ねじへ巻き付けて共締めするだけです。ハンダ付けは必要ありません。ねじの頭の裏側に巻き付けてねじと一緒に締めるだけですそのワイアーはコントロールラインのワイヤーと一緒のルートでケースの外へ取り出してください。
上記2本のワイヤーはハードウェアトリガーとなる機器へ一緒に接続します。以下は私が使ったハードウェアトリガーでの説明になりますが自分の好きな機器を使ってもらって構いません。最初私がワイヤー配線の近くで5V電圧をかけたところ、コントロールラインに予期せぬ妨害が発生し起動時にPS3がクラッシュしたので注意してください。
私が使用したハードウェアトリガーはSX28 microcontrollerで、何年か前に購入したプログライングキットに付属していたものです。このSX28を使うにはSX28チップとチップにプログラミングするためのもの(通常はSX-KEYかSX-Blitz)、SX28チップを50MHzで動作させるためのオシュレーターが必要です。これら必要なものは上記プログラミングキットに同梱されています。大勢の人が買ってくれたら私xorloserのおかげですから、SX-keyのUSB版をくれると言ってくれないだろうかと期待してます。何しろ私のは古いシリアル版なので
以下はWindowsのペイントで作成したため安っぽいですが私の作った回路図面です。私は先に述べたプログラミングキットを使いSX-Key programmerをSC-Keyを取り付けてオシュレーターとして利用しました。外部オシュレーターは使っていませんのでそれについては分かりません。いずれにせよチップを動作させるためにはオシュレーターかSX-Key付きのいずれかが必要です。
このSX28のソースコード(注:元記事への単なるリンクにしてあります)はパズルで言うところの最後の1ピースです。ParallaxにあるフリーのSX-Keyエディタソフトウェアを使ってSX28チップをプログラムします。PS3の準備ができたらスイッチを押して”パルス”(コントロールラインをグランドに落とす)を送り込むことが出来ます。ボタンを押してしまえばスイッチが繋がっている限り100msごとにパルスを送り続けます。回路図面の右側にあるLEDが動作の様子を示してくれます。パルスが送られている時LEDが光り、回路がきちんと動作しているのが分かると思います。私が作ったSX28のソースコードを見れば360ns長のパルスを送っていることは分かるでしょう。パルス長を測定する機器を(今は)持っていないので正確にどのくらいのパルスが送られているのかは分かりません。ポートの向きが変わる時にハードウェアがディレイを誘発させている可能性がありますが、360nsの待ち時間があってもおおよそ40nsのパルスは送っていることになります。360nsという値はトリガーできないようになる短い値を可能な限りいろいろ試してみて、そこから少し増やしていき一番短いパルスになった時の値です。
ふーっ、ようやくこれで記事は終わりです。次に記事を書くときは自分でダンプするためのソフトウェアやらとかの話になるでしょう。では。
あまり詳しくない分野の記事を翻訳する時にはだいたい事前に調べてから書くようにしています。が、ハードウェアはちょっとハードル高いです。100msごとに360nsで40ns?親切なチュートリアルだと思いますがPS3 exploitチュートリアル:ソフトウェア編の時に感じた「いっちょやってみるか!」的前向き意思を自分の中に感じませんでした。
あー、このことか、40nsのパルスって!とひらめいた方は是非試してみてください。もちろん自己責任で。
ふーっ、長文は疲れる。
誰か試してGameGazにトピック作りませんか?←人任せ