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」は文字列「AAAA」を表します。各「A」は文字であり、したがって1バイトのメモリです。)

チュートリアルから、メモリが解放されたと思われる場合、関数Free_Heap()はアドレス "AAAA"=0x4141414dから読み取りたいと言っています。「使用済み」フィールドは、ヘッダーセクションの先頭から12バイトのオフセットであるため、0x41414141 + 0xc=0x4141414dであるという説明があります。私には、その説明は次の理由で意味がありません。

A)その値がヒープ構造上のデータが使用されているかどうかをFree_Heap()にのみ通知するのに、Free_Heap()が「used」フィールドのアドレスから読み取ろうとするのはなぜですか。「使用済み」フィールドが書き込まれている実際のデータへのポインターでない限り(チュートリアルでは言及されていません)、これは私には意味がありません。

B)ヒープ構造体の使用済みフィールドが実際に書き込まれる可能性のあるデータへのポインターであると仮定すると、オフセットはヒープの読み取り元と関係があるのはなぜですか?データセクションが(スタックのように)「使用済み」ポインタフィールドの直後に配置されている場合、データが「使用済み」を上書きしないように、データを0xcではなく0xfのオフセットに配置する必要があることを意味します。分野。

これをクリアするために役立つ入力をありがとう。

4

1 に答える 1

1

記事のその部分は、間違っているか、本当に下手に書かれているようです。後続のメモリ オブジェクトが使用されているかどうかを読み取る ために読み取りますが、おっしゃる通り、そのandフィールドは 0x41414141 になるため、マージしようとしません。それでも、セットアップは問題ありません。その後すぐに、これらのポインターの 1 つを逆参照します。「ライン」メモリ オブジェクト (ヘッダーを踏みつけたオブジェクト) を解放するときに、そのオブジェクトとメモリ ブロックが使用されているかどうかを確認しようとします。これらのポインター フィールドのいずれかを逆参照すると、クラッシュするか、積極的に悪用されます。hdr->next->usedusedsizenextprev

于 2012-04-18T12:02:53.843 に答える