Basic Stack Binary Exploitation Methodology
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:呼び出す必要のあるコード内の関数(おそらく特定のパラメータを使用して)があります。
PIEやcanaryなしの通常のbofでは、スタックに格納された戻りアドレスにアドレスを書き込むだけで済みます。
PIEを使用するbofでは、それをバイパスする必要があります。
canaryを使用するbofでは、それをバイパスする必要があります。
ret2win関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:
ROPチェーン(十分なガジェットがある場合)を使用してすべてのパラメータを準備する
SROP(このシステムコールを呼び出すことができる場合)を使用して多くのレジスタを制御する
Write What Whereを介して、他の脆弱性(bof以外)を悪用して**
win
**関数を呼び出すことができます。ポインタのリダイレクト:スタックに関数へのポインタが含まれている場合、そのアドレスを上書きすることができます。
未初期化変数:わからないことがあります。
目標:RCE
nxが無効になっている場合やシェルコードとROPを混在させる場合:
(スタック)シェルコード:スタックにシェルコードを保存してから、戻りポインタを上書きしてそれにジャンプして実行するために使用されます:
通常のbofで canaryがある場合、バイパス(リーク)する必要があります
**ASLR**がある場合、ret2esp/ret2regなどのテクニックを使用してジャンプする必要があります
これにより、シェルコードがROPチェーンと混在します。
シスコール経由
Ret2syscall: 任意のコマンドを実行するために
execve
を呼び出すのに便利です。特定のシスコールを呼び出すためのガジェットを見つける必要があります。SROPはret2execveを準備するのに役立ちます。
libc経由
Ret2lib: 通常は**
libc
からの関数(通常はsystem
)を呼び出すのに便利です。準備された引数(例:'/bin/sh'
)と共に。呼び出したい関数を含むライブラリをバイナリがロードする必要があります**。静的にコンパイルされておりPIE が無効の場合、
system
と/bin/sh
のアドレスは変わらないため、それらを静的に使用することが可能です。ASLRが無効で、ロードされたlibcのバージョンを知っている場合、
system
と/bin/sh
のアドレスは変わらないため、それらを静的に使用することが可能です。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)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
Uninitialized variables: 予測できません
Last updated