BF Addresses in the Stack
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
カナリアとPIE(位置独立実行可能ファイル)で保護されたバイナリに直面している場合、これらをバイパスする方法を見つける必要があります。
checksec
は、バイナリがカナリアで保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。
ただし、関数呼び出しの最初にスタックに値が保存されており、その値が終了前にチェックされることを見つけることで、手動で気づくことができます。
PIEをバイパスするためには、 いくつかのアドレスをリークする必要があります。 バイナリがアドレスをリークしていない場合、最善の方法は、脆弱な関数内のスタックに保存されたRBPとRIPをブルートフォースすることです。 たとえば、バイナリがカナリアとPIEの両方で保護されている場合、カナリアをブルートフォースし始め、その後の8バイト(x64)が保存されたRBPであり、次の8バイトが保存されたRIPになります。
スタック内の戻りアドレスは、メインバイナリコードに属していると考えられています。脆弱性がバイナリコードにある場合、通常はその通りです。
バイナリからRBPとRIPをブルートフォースするには、有効な推測バイトが正しい場合、プログラムが何かを出力するか、単にクラッシュしないことを確認できます。カナリアをブルートフォースするために提供された同じ関数を使用して、RBPとRIPをブルートフォースできます:
PIEを打破するために必要な最後のことは、漏洩したアドレスから有用なアドレスを計算することです:RBPとRIPです。
RBPから、スタックにシェルを書き込んでいる場所を計算できます。これは、スタック内の文字列_"/bin/sh\x00"_を書き込む場所を知るのに非常に役立ちます。漏洩したRBPとシェルコードの間の距離を計算するには、RBPを漏洩させた後にブレークポイントを置き、シェルコードがどこにあるかを確認するだけです。次に、シェルコードとRBPの間の距離を計算できます:
RIPからPIEバイナリのベースアドレスを計算できます。これは有効なROPチェーンを作成するために必要です。
ベースアドレスを計算するには、objdump -d vunbinary
を実行し、最新のアドレスを逆アセンブルして確認します:
この例では、すべてのコードを特定するために1バイトと半分だけが必要であることがわかります。この場合、ベースアドレスは**漏洩したRIPの最後が「000」**になります。たとえば、0x562002970ecf
が漏洩した場合、ベースアドレスは0x562002970000
です。
この投稿からのいくつかの観察によると、RBPおよびRIP値を漏洩させる際に、サーバーは正しい値でないいくつかの値ではクラッシュしない可能性があり、BFスクリプトは良い値を取得したと考えることがあります。これは、正確な値でなくても、いくつかのアドレスがそれを壊さない可能性があるためです。
そのブログ投稿によると、サーバーへのリクエストの間に短い遅延を追加することが推奨されています。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)