EIPの制御
リターンアドレスを上書きします
「EIPの制御」はCoddyKit上の無料Ethical Hacking Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはEthical Hacking Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ethical Hacking Academyコースには全4レッスンが含まれています。
目標
オフセットが分かったので、EIPに任意の4バイトを配置できます。ここで問題になるのは、どのアドレスを設定すべきかということです。
EIPにはshellcodeを指させたいものの、スタックアドレスをそのままハードコードすることはできません。信頼性の高いジャンプが必要です。
スタックアドレスをハードコードしない理由
shellcodeが置かれるスタックアドレスは、実行ごと、システムごとに変動する可能性があります。環境が少し変わるだけでもアドレスは移動します。
代わりに、メモリ上にすでに存在し、ESPが現在指している場所へ実行をリダイレクトする安定した命令を使います。
JMP ESPトリック
クラッシュ時にESPがshellcodeを指していれば、EIPにJMP ESP命令のアドレスを設定できます。EIPにそのアドレスが読み込まれると、CPUはjmp espを実行し、shellcodeへジャンプします。
この間接指定により、正確なスタックアドレスに左右されず、エクスプロイトの信頼性が高まります。
jmp esp ; opcode FF E4JMP ESPを見つける
ロード済みモジュール(できればASLRなしのもの)から、オペコードバイトFF E4を探します。モジュールのベースアドレスは一定なので、このガジェットは信頼して使用できます。
mona.pyのようなツールは、適切な命令を自動的に見つけます。
!mona jmp -r esp -cpb "\x00"問題のある文字を避ける
一部のバイト値は、入力がバッファへ完全に届く前に内容を壊します。代表的なものはNULLバイトの0x00で、C文字列を終端します。ほかには0x0a(改行)や0x0d(キャリッジリターン)があります。
JMP ESPのアドレスには、これらの問題のある文字を含めてはいけません。
問題のある文字を特定する
どのバイトが問題になるかを調べるには、0x00から0xffまでのすべてのバイト値をバッファに送り、デバッガーでメモリを確認します。内容が変更されたり欠落したりしたバイトが問題のある文字です。
これらはリターンアドレスとshellcodeの両方から除外します。
!mona bytearray -cpb "\x00"EIP上書きを構築する
ここで入力を組み立てます。オフセットまでパディングを置き、その後にJMP ESPのアドレスをリトルエンディアン順で置きます。
JMP ESPが0x625011AFにある場合、書き込むバイトは逆順になります。
buf = "A"*offset + "\xaf\x11\x50\x62" # 0x625011AF, little-endianジャンプを検証する
デバッガーでJMP ESPのアドレスにブレークポイントを設定し、エクスプロイトを実行します。EIPがそこに到達し、ESPへステップインすれば、信頼性の高いリダイレクトを確認できました。
この時点で、EIPはshellcodeを配置する位置を指しています。
shellcode用の領域を確保する
リターンアドレスの後にある残りのバッファ(ESPが指す領域)にshellcodeを格納します。空きが少ない場合は、短いジャンプを使うか、配置場所を移動する必要があります。
shellcodeの前にNOPスレッド(0x90のノーオペレーションバイトを連続させたもの)を置くと、ジャンプ先がスレッド内のどこであってもよくなるため、余裕が生まれます。
buf = "A"*offset + ret + "\x90"*16 + shellcode全体を組み立てる
これでエクスプロイト全体の構造が明確になりました。
- オフセットまでのパディング。
- JMP ESPのアドレス(問題のある文字を含まず、リトルエンディアン)。
- NOPスレッド。
- shellcode。
シェルを起動するまであと一歩です。
JMP ESPの代替手段
JMP ESPは古典的なリダイレクト方法ですが、これだけではありません。別のレジスタがバッファを指している場合は、jmp eax、call esp、またはpush esp; retガジェットを使えます。
原理は同じで、shellcodeがある場所へ制御を移す安定した命令を見つけます。
クイックチェック
JMP ESPがハードコードしたスタックアドレスより好まれる理由を思い出してください。
まとめ
これで実行フローを制御できるようになりました。
- 不安定なスタックアドレスの代わりに、JMP ESPガジェットのアドレスでEIPを上書きします。
- 非ASLRモジュール内でガジェットを見つけ、
0x00のような問題のある文字を避けます。 - アドレスをリトルエンディアンで書き込み、shellcodeの前にNOPスレッドを追加します。
次はshellcodeを生成してシェルを起動します。
よくある質問
「EIPの制御」レッスンは無料ですか?
はい。「EIPの制御」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ethical Hacking Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ethical Hacking Academyコースには全4レッスンが含まれています。
「EIPの制御」で何を学びますか?
リターンアドレスを上書きします ブラウザで直接実行するハンズオンコードでEthical Hacking Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ethical Hacking Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのEthical Hacking Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「EIPの制御」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このEthical Hacking Academyレッスンでコードを書いて実行できますか?
はい。すべてのEthical Hacking Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。