PowerPCビッグエンディアンアーキテクチャのハードリバースまたはファイルリバース機能

CTFにはリバースエンジニアリングの仕事が必須であり、NeoQUESTも例外ではありません。 各タスクに「ツイスト」を追加します。これにより、参加者がタスクを完了するのが難しくなり、一方で、まだ取り組んでいないものに対処するのに役立ちます。



「ハイライト」について話すと、惑星エンディアン「クルーを救う」のオンラインステージNeoQUEST-2017のタスクはほとんどカップケーキです! カットへ、逆のジャングルへようこそ。PowerPCBig -EndianアーキテクチャとQEMUについて少し話しましょう。



そして、6月29日に NeoQUEST-2017「Face-to-face」がサンクトペテルブルクで開催されることを思い出させてください。 「フェイスツーフェイス」プログラムに含まれるものの詳細については、 こちらとサイトをご覧ください



どこから始めますか? 伝説から!



だから...宇宙船が宇宙の広がりを耕している間、NeoQUESTメンバーは惑星「エンディアン」で自分自身を見つけ、「行方不明と考えられていた最後の遠征の船を発見しました!」 もう悪くない! そして、宇宙でもIPアドレスを使用していることを知ってうれしいです。



凡例を注意深く読み、次の情報を取得します。



  1. オンボードコンピューター213.170.100.211のIPアドレス
  2. 「特別な」ファイル1_8139.rom
  3. PowerPCビッグエンディアンバイナリ2_quest.cod_data


最初に行うことは、このIPアドレスをブラウザーのアドレスバーに挿入し、それを駆動することです!









タブの名前はすぐに最初のヒントを提供します。 どういうわけかQEMUがここで使用されています。 ファイル1_8139.romを忘れないように登録してロードするために、目盛りを付けます。









何が起こっているの? 明らかにqemu仮想マシンからのスクリーンショットが表示されます;スクリーンショットでは、パスワードを入力してください。 しかし、それを紹介する方法は? ただし、奇妙なファイルをアップロードするだけです... SeaBIOSとROMからの起動... QEMUで作業した人は、おそらくどの種類のファイルを読み込んでいるかをすでに推測しているでしょう。 しかし、実験をきれいにするために、ファイルコマンドを設定してみましょう。









したがって、8139ファイルはBIOS ROM拡張またはPCI拡張ROMであることがわかります。

任意のファイルをダウンロードしようとすると、出力は次のようになります。









最初の3バイトがチェックされているようです。 さて、これは問題ではありません-最初の3バイトを要求どおりに配置し、...何もありません! 同じこと。 どうして? しかし、ファイルがPCI拡張ROM形式でない場合、qemuは単にファイルを起動しません。 そして、割り当てによって判断すると、そこにも署名があります。 さらに理解します。



PCI拡張ROM



これはどんな獣ですか? PCI拡張ROMは、論理PCIデバイス用の初期化コードの特別な部分であり、通常はBIOSまたはPCIデバイスのチップに保存されます。 最も一般的な使用例の1つは、ネットワークブート(PXE)メカニズムの実装です。 これがどのように発生するかを確認するには、パラメーターなしでqemuを実行し、CD / HDDからの起動に失敗すると、qemuにPXEが表示されます。









ファイルのタイプを決定しました。その構造を見てみましょう。









x86では、PCI ROMには署名0x55aaの最初の2バイトがあり、3番目のバイトはモジュールのサイズ(PCI ROMサイズ= 3バイト* 512)を示し、4番目のコードには実行可能コードが既に含まれています。 ほとんどのPCI ROMでは、すべてではないにしても、これは初期化コードへの通常のジャンプです。



そうそう、私はほとんど忘れていました。これはかなり古いテクノロジーであり、UEFIよりも前に使用されていたため、私たちが持っているコードはすべて16ビットリアルモードです。



さらに、バイト0x18はPCIR構造のオフセットを示し、0x1AはPnP構造を示します。 これらの構造は本質的に公式であり、PCI ROMモジュールに関する基本情報を伝達します。

熱心な読者は、ベンダーとデバイスIDがreltek 8139ネットワークカードに対応していることに気付くでしょう。



これらの構造の中で、PnPは最も興味深いものです。 チェックサムやブートストラップエントリなどの興味深いフィールドが含まれています。



ブートストラップエントリは、このデバイスから起動しようとしたときに制御が転送されるコードを指します。 この場合、次のようになります。









そして、私たちが見るように、それは私たちのスクリーンショットに非常に似ています。つまり、私たちは正しい軌道に乗っています! ここで必要なのは、パスワード検証手順を記録し、変更されたウェブカメラファイルをフィードすることです。



PnP構造にチェックサムフィールドがあることを忘れないでください。 cheksummaはどのように考慮されますか? 簡単です-最初は0x00に設定され、ファイルの合計バイトが考慮されます。 次に、受け取った金額が0x100から差し引かれます。 したがって、必要な値を取得します。 なぜ0x100なのですか? 16進数が1バイトだからです。 実際、チェック中のすべてのバイトの合計は0x0を示すはずです。 つまり、バイトの合計が0x10を示した場合、16進数の値は0xF0になります。



モジュールがロードされると、qemuで起動することは明らかです。 しかし、qemu -option-rom 1_8139.romコマンドを使用しようとすることを妨げるものは何もありません



すべてが正しく行われた場合(ROMにパッチを適用し、チェックサムを修正する)、このROMは単純に制御をBIOSに戻します。 ウェブカメラで試してみます...成功しました! 新しいものが登場しました:









CRCを読む? 別のチェックリスト? まあ、少なくとも行は、モジュールをテストするためにCRC(したがってXOR)を使用することを示唆しています。 モジュールでこの値を見つけます。









ファイルのほぼ最後。 場所はわかっていますが、CRC署名アルゴリズムを理解する必要があります。 または、少なくとも多項式を見つけて、オプションを整理できます。 割り当て時には、PowerPCビッグエンディアンが与えられます。 あらゆる種類のPPCで私たちを怖がらせる必要はありません。すでに怖いです。 HEXエディターであるIDA Proをお試しください!



ファイルサイズは非常に大きいため、ここでは「額」ソリューションはほとんど適切ではありません。 手がかりを探してみましょう:CRCアルゴリズムとメッセージ「CRCエラー」。 まず、エラーメッセージを見つけます。文字列ユーティリティはここで役立ちます。









いいね! すべてありますが、なぜ2回ですか? それを理解しましょう! HEXエディターまたはIDAを調べます。









この行と、残りのエラーメッセージが見つかりました。 また、慎重に見てください! -各エラーメッセージの前に2バイトがあり、非常に似ています。 まあ、0xFFFF(または-1)はすべてをその場所に置きます。 これは、エラーメッセージの連想配列です。 IDA Proで構造を作成し、この美しさを手に入れましょう。















ロジックに従って、このコードはすべてエラーコードを使用します。 ただし、エラーコード0x1604と0xA04の2つのヒットがあります。 さて、私たちは両方を見ます。



0x1604



IDAの言及0x1604で探しています:









素晴らしい、2ヒット。 見て!









このコードはCRCの正当性をチェックします。 便宜上、0x42944での関数呼び出しをcrc_1604としてすぐに示し、関数がレジスタR3を介して値を返すことを覚えています。 ほとんどの場合、レジスタR29には記録されたCRCの値が保存され、レジスタR0にはCRCの計算値が格納されます。 これは、crc_1604機能コードを表示すると明らかになります。









小さな機能ですが、CRCとは異なります。 ここには多項式はありませんが、通常のバイトXORが使用されます! ここから、コード0x1604がシングルバイトの擬似CRC用であることがすぐに明らかになります。 また、計算された値がR3を介して呼び出し関数に返されることも明らかであり、おそらく、CRCは以前に書き込まれた値と比較されるか、CRCがゼロでなければなりません。 最も一般的な2つの整合性チェックを次に示します。

さて、コード0xA04が必要です-見てください!



0xA04



同様に、IDAで0x1604の言及を探します。









ああ、たった一つの機能、私たちは幸運です!









それで目に見えるものは何ですか? コード0xA04は、レジスタr3がゼロに等しくない場合にのみ設定されます。 したがって、0x229c8の関数がクライアントです!









コードのこれらのセクションにすぐに注意を払ってください! はい、通常のXORもここで使用されます。すでに4バイトしかありません。 関数を詳細に分析すると、チェック対象のファイルに課せられているいくつかの条件を見つけることができます。 ただし、ファイル形式があり、署名メカニズムのみが必要なため、これは必要ありません。 見つけた! 4バイトの通常のXOR。

特に不信者は、このサイトのおおよその逆コンパイルを示すことができます( retdec.comに感謝します )。









CRCカウントを書き込んでキーを取得するだけです。 (size--){crc ^ = * input ++;}の間に必要なコード行を記述し、PCI ROMファイルの最後にある値を置き換えます。 チェックサムを変更することを忘れないでください、ii ...私たちはチャンピオンです!









対決では、それも面白いでしょう!



この任務を行っている間、私たちは少し懐かしくなり、MacBookがPowerPC上にあった時代を思い出しました。なぜなら、Intelの美しく多様な世界はないからです!



サンクトペテルブルクでの6月29日の最終的なハッククエストコンペティションの参加者は、多くの異なるタスクを見つけるでしょう。はるかに!



All Articles