浏览器堆喷时,为什么说堆头大小是32字节?

最近在研究浏览器精准堆喷相关的技术,找到老外的一篇文章中提到计算堆喷的数据块时,应该减去一些必要的大小,如:堆头32字节,BSTR结构的6个字节(BSTR长度和结束符)

http://www.exploit-monday.com/2011/08/targeted-heap-spraying-0x0c0c0c0c-is.html
文中提到:
在这里插入图片描述
其中为什么要减去堆头大小32字节,让我很疑惑,因为我看到的堆头明明只有8个字节啊!

在这里插入图片描述

经过查询了很多外文资料,也是给解释堆的头结构大小只有8个字节,如下图:

资料一:
在这里插入图片描述

资料二:
在这里插入图片描述

经过动手调试发现,原来真的是32字节,
我在堆喷后的块中,选择了第一个堆块,入口地址为0x037b0018
在这里插入图片描述
这些堆喷申请的堆块是在默认堆中分配出来的,它的父级堆地址就是0x140000,结构是**_HEAP**,通过查看父级堆的结构,发现了一个和0x37b0018很接近的地址,在VirtualAllocdBlocks字段中,一下子让我想起来,Windows内存管理中的知识!!
在这里插入图片描述
VirtualAllocdBlocks字段是一个双向链表结构,记录着0x140000这个进程中默认堆中申请过的小堆块。
在这里插入图片描述
下图中:
0)红色代表双堆碎片的向链表 8字节
1)黄色代表堆块头 8字节
2)蓝色代表堆的数据区 x字节
在这里插入图片描述
现在就解释清楚了,为什么要减去32字节的堆头了!!

猜你喜欢

转载自blog.csdn.net/cssxn/article/details/88851634
今日推荐