こんにちは私はヒープオーバーフローがどのように機能するかを理解しようとしています。私には非常に霧のように見えるこの記事を読んでいます。以下は私が立ち往生している記事のページです。
http://www.h-online.com/security/features/A-Heap-of-Risk-747224.html
リンクの4ページの後半で私の理解は終わります。2ページに独自のヒープマネージャーを実装しているので、これも役立つ場合があります。次の図は、画像データへの文字列コピー後のヒープデータ構造を表しています(これが正しいことを願っています)。
Root = Hdr Free Memory
_________________ ________________
|*Next = 0xF |----------->0xF|*Next = "AAAA" |
------------------- ------------------
|*Previous = NULL | |*Previous="AAAA"|
------------------- ------------------
|Size = 0 | |Size = "AAAA" |
------------------- ------------------
|Used = 0 | |Used = "AAAA" |
------------------- ------------------
|Free Mem Data |
(ルートを0x0から開始します。また、各フィールドは32ビットであるため、幅は4バイトです。「AAAA」は文字列「AAAA」を表します。各「A」は文字であり、したがって1バイトのメモリです。)
チュートリアルから、メモリが解放されたと思われる場合、関数Free_Heap()はアドレス "AAAA"=0x4141414dから読み取りたいと言っています。「使用済み」フィールドは、ヘッダーセクションの先頭から12バイトのオフセットであるため、0x41414141 + 0xc=0x4141414dであるという説明があります。私には、その説明は次の理由で意味がありません。
A)その値がヒープ構造上のデータが使用されているかどうかをFree_Heap()にのみ通知するのに、Free_Heap()が「used」フィールドのアドレスから読み取ろうとするのはなぜですか。「使用済み」フィールドが書き込まれている実際のデータへのポインターでない限り(チュートリアルでは言及されていません)、これは私には意味がありません。
B)ヒープ構造体の使用済みフィールドが実際に書き込まれる可能性のあるデータへのポインターであると仮定すると、オフセットはヒープの読み取り元と関係があるのはなぜですか?データセクションが(スタックのように)「使用済み」ポインタフィールドの直後に配置されている場合、データが「使用済み」を上書きしないように、データを0xcではなく0xfのオフセットに配置する必要があることを意味します。分野。
これをクリアするために役立つ入力をありがとう。