PIE
基本情報
PIE(Position Independent Executable)としてコンパイルされたバイナリは、プログラムが実行されるたびに異なるメモリ位置にロードされるため、ハードコードされたアドレスを防ぎます。
これらのバイナリを悪用するトリックは、相対アドレスを悪用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。PIEをバイパスするには、通常はスタックなどの脆弱性を利用してアドレスを1つリークするだけで十分です。アドレスを取得すると、固定オフセットによって他のアドレスを計算できます。
PIEバイナリを悪用する際の役立つヒントは、ベースアドレスが通常000で終わることです。これは、メモリページがランダム化の単位であり、0x1000バイトのサイズであるためです。このアライメントは、正しいベースアドレスが特定されたかどうかを示すため、エクスプロイトが期待どおりに機能していない場合に重要なチェックとなります。
または、エクスプロイトにこれを使用できます。アドレスが**0x649e1024
**にあることが漏洩した場合、ベースアドレスが0x649e1000
であることがわかり、そこから関数や場所のオフセットを計算するだけです。
バイパス
PIEをバイパスするには、ロードされたバイナリのアドレスをいくつか漏洩する必要があります。これにはいくつかのオプションがあります:
ASLRが無効になっている場合:ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に同じアドレスにロードされるため、PIEは無意味になります。
漏洩が与えられる(簡単なCTFチャレンジで一般的、この例をチェック)
スタック内の正しい値を漏洩するまで、スタック内のEBPおよびEIPの値をブルートフォースする:
スタックからバイナリのアドレスを漏洩するためにフォーマット文字列などの任意の読み取り脆弱性を使用し、バイナリのベースを取得してそこからオフセットを使用します。こちらで例を見つける。
参考文献
Last updated