Basic Stack Binary Exploitation Methodology

htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

ELF基本情報

何かをエクスプロイトする前に、ELFバイナリの構造の一部を理解することが興味深いです:

pageELF Basic Information

エクスプロイトツール

pageExploiting Tools

スタックオーバーフローメソドロジー

多くのテクニックがあるため、各テクニックがいつ役立つかを理解するスキームを持っていると良いです。同じ保護が異なるテクニックに影響を与えることに注意してください。保護をバイパスする方法は各保護セクションで見つけることができますが、このメソドロジーでは説明しません。

フローの制御

プログラムのフローを制御する方法はいくつかあります:

  • スタックオーバーフローを使用して、スタックから戻りポインタまたはEBP -> ESP -> EIPを上書きする。

  • オーバーフローを引き起こすために整数オーバーフローを悪用する必要があるかもしれません。

  • または任意の書き込み + 書き込む場所への実行を介して

  • フォーマット文字列を悪用して、printfを使用して任意のアドレスに任意のコンテンツを書き込む。

  • 配列インデックス:制御可能な配列を取得し、任意の書き込みを行うために設計が不十分なインデックスを悪用する。

  • オーバーフローを引き起こすために整数オーバーフローを悪用する必要があるかもしれません。

  • bof to WWW via ROP:バッファオーバーフローを悪用してROPを構築し、WWWを取得することができます。

Write What Where to Executionのテクニックは以下で見つけることができます:

urlhttps://github.com/HackTricks-wiki/hacktricks/blob/jp/binary-exploitation/arbitrary-write-2-exec/README.md

永続的なループ

考慮すべき重要な点は、通常脆弱性の単一のエクスプロイトだけでは十分でないことです。特にいくつかの保護をバイパスする必要がある場合があります。したがって、単一の脆弱性を同じバイナリの実行中に複数回エクスプロイト可能にするオプションを検討することが興味深いです:

  • ROPチェーンに**main関数のアドレスまたは脆弱性が発生しているアドレス**を書き込む。

  • 適切なROPチェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません。

  • exitアドレスをGOT(または終了前にバイナリで使用される他の関数)に書き込んで、脆弱性に戻るアドレスを指定します。

  • .fini_arrayで説明されているように、ここに2つの関数を保存し、脆弱性を再度呼び出すための1つと.fini_arrayから再度関数を呼び出す**__libc_csu_fini**のためのもう1つを保存します。

エクスプロイトの目標

目標:既存の関数を呼び出す

  • ret2win:呼び出す必要のあるコード内の関数(おそらく特定のパラメータを使用して)があります。

  • PIEcanaryなしの通常のbofでは、スタックに格納された戻りアドレスにアドレスを書き込むだけで済みます。

  • PIEを使用するbofでは、それをバイパスする必要があります。

  • canaryを使用するbofでは、それをバイパスする必要があります。

  • ret2win関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:

  • ROPチェーン(十分なガジェットがある場合)を使用してすべてのパラメータを準備する

  • SROP(このシステムコールを呼び出すことができる場合)を使用して多くのレジスタを制御する

  • ret2csuret2vdsoからのガジェットを使用して複数のレジスタを制御する

  • Write What Whereを介して、他の脆弱性(bof以外)を悪用して**win**関数を呼び出すことができます。

  • ポインタのリダイレクト:スタックに関数へのポインタが含まれている場合、そのアドレスを上書きすることができます。

  • ASLRPIEはアドレスに影響を与える可能性があります。

  • 未初期化変数:わからないことがあります。

目標:RCE

nxが無効になっている場合やシェルコードとROPを混在させる場合:

  • (スタック)シェルコード:スタックにシェルコードを保存してから、戻りポインタを上書きしてそれにジャンプして実行するために使用されます:

  • 通常のbofで canaryがある場合、バイパス(リーク)する必要があります

  • **ASLRnx**がない場合、スタックのアドレスにジャンプすることができます

  • **ASLR**がある場合、ret2esp/ret2regなどのテクニックを使用してジャンプする必要があります

  • **nx**がある場合、ROPを使用してmemprotectを呼び出してページをrwxにし、その後そこにシェルコードを保存するために(たとえばreadを呼び出して)ジャンプする必要があります。

  • これにより、シェルコードがROPチェーンと混在します。

シスコール経由

  • Ret2syscall: 任意のコマンドを実行するためにexecveを呼び出すのに便利です。特定のシスコールを呼び出すためのガジェットを見つける必要があります

  • もしASLRまたはPIEが有効になっている場合、バイナリやライブラリからのROPガジェットを使用するためには、それらを打破する必要があります

  • SROPret2execveを準備するのに役立ちます。

  • ret2csuret2vdsoから複数のレジスタを制御するためのガジェット

libc経由

  • Ret2lib: 通常は**libcからの関数(通常はsystem)を呼び出すのに便利です。準備された引数(例:'/bin/sh')と共に。呼び出したい関数を含むライブラリをバイナリがロードする必要があります**。

  • 静的にコンパイルされておりPIE が無効の場合、system/bin/shアドレスは変わらないため、それらを静的に使用することが可能です。

  • ASLR無効で、ロードされたlibcのバージョンを知っている場合、system/bin/shアドレスは変わらないため、それらを静的に使用することが可能です。

  • ASLRが有効でもPIE無効の場合、libcを知っていてバイナリがsystem関数を使用している場合、'/bin/sh'のアドレスと共に**GOT内のsystemのアドレスにret**することが可能です(これを解明する必要があります)。

  • ASLRが有効でもPIE無効の場合、libcを知っていてバイナリがsystemを使用していない場合:

  • ret2dlresolveを使用してsystemのアドレスを解決し、それを呼び出す

  • ASLRバイパスして、メモリ内のsystem'/bin/sh'のアドレスを計算します。

  • ASLR有効PIE有効で、libcを知らない場合:以下が必要です:

  • PIEをバイパスする

  • 使用されている**libcバージョン**を見つける(いくつかの関数アドレスをリークさせる)

  • 続行するためにASLRの前のシナリオを確認します。

EBP/RBP経由

  • Stack Pivoting / EBP2Ret / EBP Chaining: スタック内の保存されたEBPを介してESPを制御してRETを制御します。

  • オフバイワンスタックオーバーフローに便利

  • EIPを制御する代替方法として役立ち、EIPを悪用してメモリ内でペイロードを構築し、それにEBPを介してジャンプする方法

その他

  • Pointers Redirecting: スタックに呼び出される関数へのポインタや、興味深い関数(systemやprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。

  • ASLRまたはPIEがアドレスに影響を与える可能性があります。

  • Uninitialized variables: 予測できません

Last updated