Basic Stack Binary Exploitation Methodology
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
何かをエクスプロイトする前に、ELFバイナリの構造の一部を理解することが興味深いです:
多くの技術があるため、各技術がどのように役立つかのスキームを持つことが良いです。同じ保護が異なる技術に影響を与えることに注意してください。各保護セクションで保護を回避する方法を見つけることができますが、この手法ではありません。
プログラムのフローを制御する方法はいくつかあります:
スタックオーバーフローによってスタックからのリターンポインタまたはEBP -> ESP -> EIPを上書きする。
オーバーフローを引き起こすために整数オーバーフローを悪用する必要があるかもしれません。
または任意の書き込み + 実行への書き込み。
フォーマット文字列: printf
を悪用して任意の内容を任意のアドレスに書き込む。
配列インデックス:不適切に設計されたインデックスを悪用して、いくつかの配列を制御し、任意の書き込みを取得する。
オーバーフローを引き起こすために整数オーバーフローを悪用する必要があるかもしれません。
bofからWWWへのROP:バッファオーバーフローを悪用してROPを構築し、WWWを取得できるようにします。
実行への書き込み技術は以下で見つけることができます:
考慮すべきことは、通常脆弱性の1回のエクスプロイトだけでは成功したエクスプロイトを実行するには不十分であることです。特にいくつかの保護を回避する必要があります。したがって、単一の脆弱性を同じバイナリの実行中に複数回エクスプロイト可能にするいくつかのオプションを議論することが興味深いです:
main
関数のアドレスまたは脆弱性が発生しているアドレスをROPチェーンに書き込む。
適切なROPチェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません。
exit
のGOT内のアドレス(またはバイナリが終了する前に使用する他の関数)に脆弱性に戻るアドレスを書き込む。
.fini_arrayで説明されているように、ここに2つの関数を格納し、1つは再度脆弱性を呼び出し、もう1つは__libc_csu_fini
**を呼び出して再度.fini_array
の関数を呼び出します。
ret2win:フラグを取得するために呼び出す必要があるコード内の関数(特定のパラメータで呼び出す必要があるかもしれません)。
PIEがない通常のbofでは、スタックに保存されたリターンアドレスにアドレスを書き込むだけで済みます。
PIEがあるbofでは、それを回避する必要があります。
canaryがあるbofでは、それを回避する必要があります。
ret2win関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:
すべてのパラメータを準備するのに十分なガジェットがある場合は、ROPチェーンを使用します。
SROP(このシステムコールを呼び出せる場合)を使用して多くのレジスタを制御します。
Write What Whereを介して、他の脆弱性(bofではない)を悪用して**win
**関数を呼び出すことができます。
ポインタのリダイレクト:スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
未初期化変数:あなたは決してわかりません。
(スタック)シェルコード:これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、次にそれにジャンプして実行するのに役立ちます:
いかなる場合でも、 canaryがある場合、通常のbofではそれを回避する必要があります(漏洩)
ASLRがない場合、nxがない場合、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
ASLRがある場合、ret2esp/ret2regのような技術を使用してそこにジャンプする必要があります。
nxがある場合、いくつかのROPを使用してmemprotect
を呼び出し、ページをrwx
にする必要があります。その後、シェルコードをそこに格納し(例えばreadを呼び出す)、そこにジャンプします。
これはシェルコードとROPチェーンを混合します。
Ret2syscall: 任意のコマンドを実行するためにexecve
を呼び出すのに役立ちます。特定のシステムコールをパラメータで呼び出すためのガジェットを見つける必要があります。
SROPはret2execveを準備するのに役立ちます。
Ret2lib: libc
からの関数(通常はsystem
)を呼び出すのに役立ちます。準備された引数(例:'/bin/sh'
)を使用します。呼び出したい関数を持つライブラリをバイナリがロードする必要があります(通常はlibc)。
静的にコンパイルされていて、 PIEがない場合、system
と/bin/sh
のアドレスは変わらないため、静的に使用することが可能です。
ASLRがない場合、libcのバージョンを知っている場合、system
と/bin/sh
のアドレスは変わらないため、静的に使用することが可能です。
ret2dlresolve
を使用してsystem
のアドレスを解決し、呼び出します。
ASLRを回避し、メモリ内のsystem
と'/bin/sh'
のアドレスを計算します。
ASLRとPIEがあり、libcを知らない場合:次のことを行う必要があります:
PIEを回避します。
使用されている**libc
バージョン**を見つけます(いくつかの関数アドレスを漏洩させます)。
続行するためにASLRを使用した前のシナリオを確認します。
スタックピボット/EBP2Ret/EBPチェイニング:スタック内の保存されたEBPを通じてRETを制御するためにESPを制御します。
オフバイワンスタックオーバーフローに役立ちます。
EIPを制御しながら、メモリ内にペイロードを構築し、次にEBPを介してそれにジャンプするための代替手段として役立ちます。
ポインタのリダイレクト:スタックに呼び出される関数へのポインタや、興味のある関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
未初期化変数:あなたは決してわかりません。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)