Memory management 不理解堆溢出文章

Memory management 不理解堆溢出文章,memory-management,linux-kernel,kernel,heap,Memory Management,Linux Kernel,Kernel,Heap,嗨,我想了解堆溢出是如何工作的,我一直在读这篇文章,这篇文章对我来说似乎很模糊。下面是我一直坚持的那篇文章 我的理解在链接第4页的后半部分之后停止。他们在第2页实现了自己的堆管理器,这可能也很有用。下图表示字符串复制到图像数据后的堆数据结构(希望这是正确的) (让根从0x0开始。每个字段也是32位,因此4字节宽。“AAAA”代表字符串“AAAA”,其中每个“A”是一个字符,因此是一个字节的内存。) 从教程中,他们说,当假定内存被释放时,函数Free_Heap()将希望从地址“AAAA”=0x4

嗨,我想了解堆溢出是如何工作的,我一直在读这篇文章,这篇文章对我来说似乎很模糊。下面是我一直坚持的那篇文章

我的理解在链接第4页的后半部分之后停止。他们在第2页实现了自己的堆管理器,这可能也很有用。下图表示字符串复制到图像数据后的堆数据结构(希望这是正确的)

(让根从0x0开始。每个字段也是32位,因此4字节宽。“AAAA”代表字符串“AAAA”,其中每个“A”是一个字符,因此是一个字节的内存。)

从教程中,他们说,当假定内存被释放时,函数Free_Heap()将希望从地址“AAAA”=0x414d读取。这里的解释是,“used”字段是从报头部分开始的12个字节的偏移量,因此0x4141+0xc=0x414D。对我来说,这种解释毫无意义,原因如下

A) 为什么Free_Heap()甚至会尝试从“used”字段中的地址读取,而该值只告诉Free_Heap()堆结构上的数据是否正在使用。除非“used”字段是指向正在编写的实际数据的指针(教程中没有提到),否则这对我来说没有任何意义

B) 假设heap结构中的used字段实际上是指向可能写入的数据的指针,那么为什么偏移量与读取堆的位置有关呢?可能是,如果数据段正好位于“used”指针字段之后(如在堆栈中),则这意味着数据应放置在0xf而不是0xc的偏移量处,以便数据不会覆盖“used”字段


感谢您提供的帮助,以澄清此问题

这篇文章的那一部分要么是错的,要么就是写得很糟糕。虽然它将读取
hdr->next->used
以检查后续内存对象是否正在使用,但正如您所说,它的
used
size
字段将是0x4141,因此我们不会尝试与它合并。尽管如此,设置还是很好的,稍后您将取消对其中一个指针的引用:当释放“line”内存对象(我们踩踏了其标头的对象)时,它将尝试检查其
next
prev
内存块是否正在使用。取消引用这些指针字段中的任何一个都将崩溃或被积极利用。

这比我在文章中读到的更有意义。谢谢,在我放弃并询问stackoverflow之前,我一定已经读了20遍了。
  Root = Hdr                        Free Memory
 _________________                 ________________
|*Next = 0xF      |----------->0xF|*Next = "AAAA"  |
-------------------               ------------------
|*Previous = NULL |               |*Previous="AAAA"|
-------------------               ------------------
|Size = 0         |               |Size = "AAAA"   |
-------------------               ------------------
|Used = 0         |               |Used = "AAAA"   |
-------------------               ------------------
                                  |Free Mem Data   |