PIE

HackTricksのサポート

基本情報

PIE、またはPosition Independent Executableとしてコンパイルされたバイナリは、プログラムが実行されるたびに異なるメモリ位置にロードできるため、ハードコードされたアドレスを防ぎます。

これらのバイナリを悪用するトリックは、相対アドレスを悪用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。PIEをバイパスするには、通常はスタックからのリークなどの脆弱性を利用して、1つのアドレスをリークするだけです。アドレスを取得したら、固定オフセットによって他のアドレスを計算できます。

PIEバイナリを悪用する際の役立つヒントは、基本アドレスが通常000で終わることです。これは、メモリページがランダム化の単位であり、0x1000バイトのサイズであるためです。このアライメントは、正しい基本アドレスが特定されたかどうかを示すため、エクスプロイトが期待どおりに機能していない場合に重要なチェックになります。 または、エクスプロイトにこれを使用できます。アドレスが**0x649e1024**にあることが漏洩した場合、基本アドレスが0x649e1000であることがわかり、そこから関数や場所のオフセットを計算できます。

バイパス

PIEをバイパスするには、ロードされたバイナリのアドレスをいくつかリークする必要があります。これにはいくつかのオプションがあります:

  • ASLRが無効: ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に同じアドレスにロードされるため、オブジェクトのアドレスは常に同じ場所になり、PIEは無効になります。

  • リークを受け取る(簡単なCTFチャレンジで一般的、この例をチェック)

  • スタック内の正しい値をリークするまで、スタック内のEBPとEIPの値をブルートフォースする:

BF Addresses in the Stack
  • フォーマット文字列などの任意の読み取り脆弱性を使用して、バイナリのアドレスをリークさせる(たとえば、前述のテクニックと同様にスタックから)してバイナリのベースを取得し、そこからオフセットを使用します。こちらで例を見つける

参考文献

HackTricksのサポート

Last updated