こんにちは、私はヒープオーバーフローの仕組みを理解しようとしています。以下は私が執着している記事のページです。ヒープオーバーフローの記事を理解していません
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」はそれぞれ「A」は、文字やメモリのその1バイト文字列「AAAA」の略。)
チュートリアルでは、メモリが解放されたと仮定すると、関数Free_Heap()はアドレス "AAAA" = 0x4141414dから読み込みたいと言います。ここでの説明は、「used」フィールドがヘッダセクションの先頭から12バイトのオフセットであるため、0x41414141 + 0xc = 0x4141414dです。私には、以下の理由から説明が意味をなさない。
A)Free_Heap()は、ヒープ構造上のデータが使用されているかどうかをFree_Heap()に通知するだけの場合、なぜ "used"フィールドのアドレスから読み込もうとしますか? "used"フィールドが実際に書き込まれるデータへのポインタ(チュートリアルで言及されていない)でない限り、これは私には意味がありません。
B)ヒープ構造体の使用されているフィールドが実際に書き込むことができるデータへのポインタであると仮定すると、オフセットはヒープの読み込み元と何か関係がありますか?データセクションが "使用された"ポインタフィールド(スタック内のような)の直後にあった場合は、データが "used"データを上書きしないように0xcではなく0xfのオフセットにデータを配置する必要があります。フィールド。
これをクリアしていただきありがとうございます。
これは、私が記事で読んだことよりもはるかに意味があります。ありがとう、私はあきらめて、stackoverflowを尋ねる前に20回そのセクションを読んでいる必要があります。 –