ニンテンドーDSiのブラウザが日本で発売されてから15年経って、なんとか儲けました。 この投稿では、動きと技術的なミニチュア プリントについてシャッフルします。 。 エクスプロイトは GitHub で入手できます。 簡単な概要を含めることを大切にしていますが、TL;DR の部分にスキップすることもできます.
動機
私はブラウザをじっと見つめ始めました。 2022年の夏。私の予備的な考えは、UIUCTF 2022のために呪われたpwn chalを形成することでした。 DSi が古く、セキュリティ緩和策がないことを考えると、週末にエクスプロイトを進めようと思いました。 その見積もりは、以前はかなり外れていました。 フックや詐欺師が表示するものを1つ考え出すよりも、6か月前にミッションのオンとオフに消費されることを実行しました.
背景情報
DSi ブラウザは Opera 9.50 を使用しています。 どの機能によるセキュリティの軽減もありません。 シェルコードへのジャンプは、メニューに手を貸すことです! スタック バッファ オーバーフローは実行可能です。 合計 ブラウザー全体 にある「employ-after-frees」を悪用することは、これまで以上に簡単です。 実際、DSi には機能する設計が含まれていないため、利益を得るカーネルはありません。 さまざまな設計権限は、SCFG レジスタ によって処理されます。 ブラウザには、ほとんどの自作を早めるための十分な権限がありますが、他のエクスプロイトなしでブートを介してすべてのプロットを永続化するのに十分ではありません.
ブラウザ用の供給コードやシンボルすら含まれていません。 あるいは、DSi の問題をハッキングするのに役立つソースがいくつかあります:
melonDS – DSi住居メニュー、ブラウザ、Wi-Fiもエミュレートしてくれるかも!
ドキュメント DSi Mode Hacking Neighborhood – 何百人もの非常に有能で機能的な人々がここにいて、何か他のことを手伝っていますDSi
Google-fu?
)
当然のことながら、私は 1 つのことを確保することを望んで、Opera のバグを探し始めました。 簡単に。 exploit-db は非常に有望な結果をもたらしました. 私は自分のコンピューターで POC をホストするように python の HTTP サーバーを荒らし、melonDS で動作しているブラウザーをそのサーバーに向けました。 melonDS の出力で次のクラッシュを分析しました。 悲しいことに、私はバグを再現できなかったか、魅力的なクラッシュから離れていなかったことに偶然遭遇しました.
Webkit Structure Test Fuzzing
MrNbaYoh が 3ds エクスプロイト「validityhax」を作成ここ。 この投稿では、WebKit のすべての構造検査をブラウザーに送信することで、バグを見つけました。 本能的に、WebKit 構造検査には異常なエッジ インスタンスまたは回帰検査が含まれており、おそらく時代遅れになる WebKit 実装の問題を回避することもできます。 3ds ブラウザは WebKit を使用するため、これは 3ds ブラウザにとって理にかなっています。 DSiでも動きますか? 発見するためのテクニック
iframe でケースを見てみるフラスコ アプリをスペースアップします。 読み込みが実行されると、ページが更新され、問題がフラスコ アプリからの新しい検討に配置されます。 終了時に、flask アプリは ~100ok HTML をすべて消費し、WebKit 構造試験からの情報を確認します。 エミュレーターの任意のシーケンスを並行して学習することができます。
結果は期待外れでした。 悪用できないものとしてマークしたヌル逆参照がたくさんありました。 見た目なので、実際にはDSi上に0でマッピングされた事前取引があるのですが、間違いなく書き込み不可です。 テストでは、いくつかの多様な異常なクラッシュが発生しましたが、根本的な鼻息は、それを引き起こしたケースを見てから明らかではありませんでした. 取り壊しが過度の逆転作業を保存することを知っていれば、私はそよ風がシンボルなしで維持するつもりはありませんでした.大学の。 とはいえ、寒波が到来する頃には、新たな案が浮かんでいました
私の憶測は、おそらく構造試験に魅力的なヒープバグが含まれていたのではないかと推測していました。しかし、実際には、それらを検出するための正当な計画は含まれていませんでした. たとえば、解放後の雇用が行われたが、解放されたメモリに新しい情報が書き込まれなかった場合、私たちは解体を見つめることさえしません。 Windows または Linux で Opera 9.50 を構築した場合、ヒープ デバッグ インストゥルメントを使用して、ヒープ バグを非決定論的に破棄できるようにする別の手段として使用する可能性があります
これにより、Opera 9.50 の構造を確保するために 1 時間にわたる検索が必要になりました。 ウェイバックマシン
がやってきた救助へ。 Opera の古いダウンロード ページを確認したところ、たまたまダウンロードがアーカイブされていませんでした。 ただし、ダウンロード ページにはファイル名が表示されていたので、Google でも検索しました。 Google から、奇跡的にファイルを持っている少数の Web サイトを偶然見つけました。 私はウェブサイトを介して md5sum のすべてのプロットをクロスチェックし、それらが一致していることを確認しました。 ヒントでは、Linux コンストラクトを保護できませんでしたが、Windows コンストラクトは維持されます。
Wine にはヒープ デバッグ ファセットがあり、おそらく WINEDEBUG=警告+ヒープ。 カナリア プライス 0xfeeefeee で解放されたメモリを取得します。 そのため、解放後の雇用バグはスペースの可能性で追加されます取り壊しから。 解体ダンプでは、カナリア プライスを観察すれば、これは場合によっては、離職後の雇用が激化していることも明らかな場合があります。 構造を再実行して、wine でのファジングを見てみましょう。 私のぽっちゃりは、ワインの下にあるこの時代遅れの Opera モデルを早めるように通知します )WINEDEBUG=warn+heap WINEPREFIX=$HOME/.wine32 WINEARCH=preserve32 winedbg –gdb オペラ.exe
トロイの木馬
すべての構造の 1 つであるクラッシュを見てみましょう。悪用不可能な null 逆参照であることが、解放後の雇用であることが判明しました!
解体を引き起こす減少したコードは、私がフィードバックを追加した次のコードです:
// mediaRule.cssRules.length は 0 から始まります mediaRule.
insertRule (“
.test2 { 色: 青; }」,
mediaRule . cssRules
. 長さ ); // mediaRule.cssRules.length は 1 になりました 努力 {
// 構文エラー a で失敗します nd throws javascript exception
mediaRule . insertRule(“ @media display cloak { p { color: red; };
」
,
mediaRule
.cssRules .
長さ
); }
得る ( え ) { } // mediaRule.cssRules.length は 2 Oo になりました// ページを更新すると破棄されます
ここで異常なことが起こっています。 JavaScript 例外がスローされると、
cssRules array.それは認められますが、ここにあるのは取引からの読み取りだけです。また、それ自体が悪用される可能性があるか、またはもはや悪用されない可能性があることにも注意を払う必要があります。 私はリバース作業を維持しようとしているわけではないので、これらの破損した JavaScript オブジェクトを混乱させて、別の書き込みまたは急上昇を取得できるかどうかを調べてみましょう.
見えるからこそ、飛翔を手に入れることができるのです
0xfeeefeeee 前の後に次を追加して抜粋:
// 明らかに mediaRule.cssRules mediaRule .deleteRule ( 0 ); mediaRule . deleteRule(0);
// このプロパティにアクセスすると、0xfeeefeee mediaRule
.cssRules . 長さ;

推測する必要がある場合は、メモリの裏付け cssRules
は閉店後に解放されますdeleteRule の呼び出しであり、その長さにアクセスするときに vtable の悪ふざけがいくつか発生します。 それにもかかわらず、私はもはやリバース作業を維持するつもりはないので、わかりません. 緩和策が少ないほど、トロイの木馬から利益を得るために知る必要があることは少なくなります。 搾取
高度な目的は明確です: シェルコードによって採用された NOP スレッドをスプレーし、解放されたメモリを再利用して、NOP スレッドの取引を書き込みます
解放されたメモリ、解放されたチャンクのため、同じ測定を介してすべてのプロットを1つ割り当てる必要があります。 流行のブラウザでのエクスプロイトには、Drift32Arrays を大切にすることが慣習的な選択です。 残念ながら、これらのファセットを含まない古いブラウザーで作業しています。 時代遅れのブラウザの多様なエクスプロイトが維持しているものを探すために目を凝らして、私はそれを見つけました
str2hax
は、キャンバスを作成し、サイズを変更して適切な割り当てを形成します。 これは、DSi でも適切に機能します。 キャンバスの RGBA ピクセルを埋めることで、メモリを適切に保存できます。
ここで異常なことが起こっています。 JavaScript 例外がスローされると、
cssRules array.それは認められますが、ここにあるのは取引からの読み取りだけです。また、それ自体が悪用される可能性があるか、またはもはや悪用されない可能性があることにも注意を払う必要があります。 私はリバース作業を維持しようとしているわけではないので、これらの破損した JavaScript オブジェクトを混乱させて、別の書き込みまたは急上昇を取得できるかどうかを調べてみましょう.
見えるからこそ、飛翔を手に入れることができるのです
0xfeeefeeee 前の後に次を追加して抜粋:
// 明らかに mediaRule.cssRules mediaRule .deleteRule ( 0 ); mediaRule . deleteRule(0);
// このプロパティにアクセスすると、0xfeeefeee mediaRule
.cssRules . 長さ;

推測する必要がある場合は、メモリの裏付け cssRules
は閉店後に解放されますdeleteRule の呼び出しであり、その長さにアクセスするときに vtable の悪ふざけがいくつか発生します。 それにもかかわらず、私はもはやリバース作業を維持するつもりはないので、わかりません. 緩和策が少ないほど、トロイの木馬から利益を得るために知る必要があることは少なくなります。 搾取
. deleteRule(0);
// このプロパティにアクセスすると、0xfeeefeee mediaRule .cssRules . 長さ;
deleteRule の呼び出しであり、その長さにアクセスするときに vtable の悪ふざけがいくつか発生します。 それにもかかわらず、私はもはやリバース作業を維持するつもりはないので、わかりません. 緩和策が少ないほど、トロイの木馬から利益を得るために知る必要があることは少なくなります。 搾取
高度な目的は明確です: シェルコードによって採用された NOP スレッドをスプレーし、解放されたメモリを再利用して、NOP スレッドの取引を書き込みます
解放されたメモリ、解放されたチャンクのため、同じ測定を介してすべてのプロットを1つ割り当てる必要があります。 流行のブラウザでのエクスプロイトには、Drift32Arrays を大切にすることが慣習的な選択です。 残念ながら、これらのファセットを含まない古いブラウザーで作業しています。 時代遅れのブラウザの多様なエクスプロイトが維持しているものを探すために目を凝らして、私はそれを見つけました str2hax
エクスプロイト フロートは次のとおりです。
RGBA ピクセルの構成で、キャンバス全体に NOP スレッドの取引を書き込みます。 描画コードが美しい測定チャンクを割り当てるため、解放されたメモリを再利用します。 私たちの NOP スレッドの処理はデバッガーから行われ、ASLR がないため比較的安定しています。 これにより、ペイロードでディールをアンペアコーディングできます。
NOPスレッドとシェルコードをスプレーしてください 評価 mediaRule.cssRules.長さ; 私たちの NOP そり
これは melonDS で動作します…最も定期的に! 解放されたポインターに名前を付けましょう freed_ptr
。 それが関係するメモリは、私たちが回収し、NOPスレッド取引を書いたものです. 球形の半分の時間で、ブラウザは
に急上昇します。 )*freed_ptr、これは単に私たちのためのものであり、何のためにワインの下に見えました。 多様化した半分の時間、これはおそらく時折おそらくまたに急上昇する可能性があります*)freed_ptr、NOP 命令の逆参照を試み、そこに舞い上がる。 それは間違いなくクラッシュします。 それにもかかわらず、それは簡単な修正方法です! 当社のNOPスレッドの扱いは、命令として扱うと「NOP十分」です。 これは、NOP 命令自体 、両方のインスタンスを満たす
ペイロード
小さなビットでも確実に機能するエクスプロイトを手に入れたので、重要なシェルコードを獲得する必要があります。 多様化する DSi エクスプロイトに目を向けると、採用するのは全体的に minitwlpayload は、SD カードから boot.nds をロードして実行します。 それはトータルでひとつ大切にしていることですTWiLightメニュー. すべてのピースを組み合わせて、適切なハードウェア上で真に機能するエクスプロイトで祝うことができます.
ありがとう
- 解放後の雇用、破損したオブジェクトを含む混乱した球体を入手し、それを手に入れて、おそらく私たちが目を光らせている可能性がある取引に飛びます
melonds Wi-Fi 機能を含む実際の DSi エミュレーターを作成するためのビルダー
ポロキョン melonds 用の gdbstub を作成するため。これは以前はデバッグに不可欠でした。エクスプロイト shutterbug2000 と zoogieメモリーピット補給用 yellows8 for リファレンスファブリックとデバッグのヒント Martin Korth およびその他 これらの比類のない臨床医 ) フルメタル5 for str2hax キャンバス思考 他多数 TL;DR
DSi は Opera 9.50 を使用しているため、Google で既存の Opera 9.50 のエクスプロイトを検索して調べてください。 melonDSエミュレーターで適当な運勢がありません。 WebKitの構造試験を全てブラウザに同梱。 melonDSに相応しい運勢がありません。 Opera 9.50 Windows コンストラクトを取得し、wine の下で急いでください。 WINEDEBUG=warn+heap でワイン ヒープのデバッグを有効にします。 WINEPREFIX=$HOME/.wine32 WINEARCH=preserve32 winedbg –gdb オペラ.exe 解放後の雇用を獲得する ワインの下で再び WebKit 構造のテストを試みます
からのキャンバス トリックの使用により、解放されたメモリを再利用します。 str2hax melonDSエミュレーターでchubbyエクスプロイトを達成 エクスプロイトの検証適切なハードウェア