字节?"/>
浏览器堆喷时,为什么说堆头大小是32字节?
最近在研究浏览器精准堆喷相关的技术,找到老外的一篇文章中提到计算堆喷的数据块时,应该减去一些必要的大小,如:堆头32字节,BSTR结构的6个字节(BSTR长度和结束符)
.html
文中提到:
其中为什么要减去堆头大小32字节,让我很疑惑,因为我看到的堆头明明只有8个字节啊!
经过查询了很多外文资料,也是给解释堆的头结构大小只有8个字节,如下图:
资料一:
资料二:
经过动手调试发现,原来真的是32字节,
我在堆喷后的块中,选择了第一个堆块,入口地址为0x037b0018
这些堆喷申请的堆块是在默认堆中分配出来的,它的父级堆地址就是0x140000,结构是**_HEAP**,通过查看父级堆的结构,发现了一个和0x37b0018很接近的地址,在VirtualAllocdBlocks字段中,一下子让我想起来,Windows内存管理中的知识!!
VirtualAllocdBlocks字段是一个双向链表结构,记录着0x140000这个进程中默认堆中申请过的小堆块。
下图中:
0)红色代表双堆碎片的向链表 8字节
1)黄色代表堆块头 8字节
2)蓝色代表堆的数据区 x字节
现在就解释清楚了,为什么要减去32字节的堆头了!!
更多推荐
浏览器堆喷时,为什么说堆头大小是32字节?
发布评论