Basic 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(このシステムコールを呼び出すことができる場合)を使用して多くのレジスタを制御する

  • ret2csuおよびret2vdsoからのガジェットを使用して複数のレジスタを制御する

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

  • ポインタリダイレクト:スタックに関数へのポインタが含まれているか、興味深い関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることができます。

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

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

目標: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を悪用してメモリ内でペイロードを構築し、それにジャンプする方法

その他

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

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

  • Uninitialized variables: 予測できません。

Last updated