BF Addresses in the Stack
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習:
HackTricks Training GCP Red Team Expert (GRTE)
キャナリーとPIE(位置独立実行可能ファイル)で保護されたバイナリに直面している場合、おそらくそれらをバイパスする方法を見つける必要があります。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-95ac857d8ae19be9bc96c5b5e1a5ef50998db3d3%252Fimage%2520%28865%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=2c008b2d&sv=1)
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
を実行し、最新のアドレスを逐次分解してください:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-17d40aaabbcd4effebdca381040cfc8d939c6ffa%252Fimage%2520%28479%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=1e4213f6&sv=1)
この例では、すべてのコードを特定するのに1バイトと半分だけが必要であることがわかります。したがって、この状況では、ベースアドレスは**"000"で終わるリークしたRIP**になります。たとえば、0x562002970ecf
がリークした場合、ベースアドレスは0x562002970000
になります。
改善
この投稿からのいくつかの観察 によると、RBP と RIP の値が漏洩するとき、サーバーは正しい値でない場合にクラッシュしない可能性があり、BF スクリプトは正しい値を取得したと思うかもしれません。これは、正確な値でなくても、いくつかのアドレスがそれを壊すことが可能だからです。
そのブログ投稿によると、サーバーへのリクエスト間に短い遅延を追加することが推奨されています。
Last updated