BF Addresses in the Stack
Last updated
Last updated
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: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バイトと半分だけが必要であることがわかります。したがって、この状況では、ベースアドレスは**"000"で終わるリークしたRIP**になります。たとえば、0x562002970ecf
がリークした場合、ベースアドレスは0x562002970000
になります。
この投稿からのいくつかの観察 によると、RBP と RIP の値が漏洩するとき、サーバーは正しい値でない場合にクラッシュしない可能性があり、BF スクリプトは正しい値を取得したと思うかもしれません。これは、正確な値でなくても、いくつかのアドレスがそれを壊すことが可能だからです。
そのブログ投稿によると、サーバーへのリクエスト間に短い遅延を追加することが推奨されています。