Basic 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
**関数を呼び出すことができます。ポインタリダイレクト:スタックに関数へのポインタが含まれているか、興味深い関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることができます。
未初期化変数:わからないことがあります。
目標:RCE
nxが無効になっている場合やシェルコードをROPと混在させる場合:
(スタック)シェルコード:これは、スタックにシェルコードを保存してから、戻りポインタを上書きした後にそれにジャンプして実行するために役立ちます:
通常のbofで canaryがある場合は、バイパス(リーク)が必要です
ASLRとnxがない場合、スタックのアドレスにジャンプできるため、そのアドレスにジャンプできます
ASLRがある場合、ret2esp/ret2regなどのテクニックを使用してジャンプする必要があります
nxがある場合、ROPを使用して
memprotect
を呼び出してページをrwx
にする必要があります。その後、そこにシェルコードを保存するために(たとえばreadを呼び出して)ジャンプする必要があります。これにより、シェルコードが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を悪用してメモリ内でペイロードを構築し、それにジャンプする方法
その他
Pointers Redirecting: スタックに呼び出される関数へのポインタや、興味深い関数(systemやprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
Uninitialized variables: 予測できません。
Last updated