バッファオーバーフローについて学習していて、ファットポインターの概念を理解しましたが、完全に理解できないのは、それらがどのようにして適切に保護されるのかということです。別のアドレスを指すようにポインターを変更できた場合、ファットポインターのobjベースとobjエンドセクションを変更して、ポインターがまだ有効に見えるようにできないでしょうか?
バッファオーバーフローは、別の任意のアドレスを指すようにポインターを設定するためのものではありません。
バッファオーバーフローは、入力によってプログラムが一見正しい操作(eg "increment()
:ポインタを前方に256バイトに移動する")を何度も実行すると、その結果、ポインタが目的のデータ構造/配列の外に移動し、別のオブジェクトに移動します。
「ファットポインタ」には、データ構造/配列サイズに関する情報が含まれています。これは、increment()
がコード内に安全チェックを持ち、ポインターが適切な境界内にあることを確認できることを意味します。コードの中に安全チェックどこかが必要ですが、これにより集中化できます。
ヒープで通常発生するバッファオーバーフローの種類を考えているようです。通常、割り当てられたメモリチャンクは、次の要素と前の要素へのポインタを含むメタデータとともに、二重リンクリストに要素として格納されます。理論的には、バッファをオーバーフローさせることにより、次のメモリチャンクのメタデータを上書きすることができ、それが解放されると、関数ポインタを上書きして、任意のコード実行を引き起こす可能性があります。 悪用の詳細については、このWebサイトを参照してください
ファットポインターはこれからあなたを保護することができます:場所からの読み取りや書き込みなどの配列の各操作を内部的に境界チェックするだけで、指定されたオフセット/インデックスが有効であるかどうか、および境界がある場合にのみ行われますチェックに合格すると、操作が実行されます。 (@cloudfeetが既に言ったように)。これは、メモリの境界の後に書き込むことができないため、次のメモリチャンクのメタデータやスタック上のポインターなどを上書きできないことを意味します。