2012-04-18 10 views
0

こんにちは、私はヒープオーバーフローの仕組みを理解しようとしています。以下は私が執着している記事のページです。ヒープオーバーフローの記事を理解していません

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のオフセットにデータを配置する必要があります。フィールド。

これをクリアしていただきありがとうございます。

答えて

1

記事のその部分が間違っているか、実際にはひどく書かれているようです。 hdr->next->usedを読み込んで、後でメモリオブジェクトが使用されているかどうかを確認しますが、そのusedsizeのフィールドは0x41414141になるため、マージを試みません。それでもとなります。後でそのポインタのうちの1つを逆参照します: 'line'メモリオブジェクト(ヘッダを読み込んだもの)を解放すると、メモリブロックがnextprevであるかどうかをチェックしますつかいます。それらのポインタフィールドのいずれかを参照解除すると、クラッシュするか、または積極的に悪用されます。

+0

これは、私が記事で読んだことよりもはるかに意味があります。ありがとう、私はあきらめて、stackoverflowを尋ねる前に20回そのセクションを読んでいる必要があります。 –

関連する問題