专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
51好读  ›  专栏  ›  看雪学苑

【系列】堆溢出研究(二)

看雪学苑  · 公众号  · 互联网安全  · 2017-05-19 18:05

正文

请到「今天看啥」查看全文



根据上图中的信息我们直接转到程序中创建出的堆地址 0x360000处在(数据窗口  直接 快捷键 ctrl + g )


对于上图来到地址 0x360000处后,根据和堆溢出有关的数据结构我们直接关注 空表索引区即可(即偏移地址 0x178 地址处):


堆初始化的状态


当堆刚被初始化的时候结构很简单,

1. 其中只包含一个空闲大块(称为 “尾块”)

2. 此尾块地址位于 0x178(360178)处 (未启用块表的情况下)算上基地址就是 0x360688  (又称为freelist【0】 )


3.freelist[0] 指向“尾块 ‘,八个字节 (前四个字节是前向指针 后四个字节是后向指针 即:空表中的一对指针) ,其余的各项索引都指向其自身


对堆块块首做一个简介 ####

堆块的块首占八个字节下面根据占用态和空闲态分别介绍:


共同点:

  • 0-2 字节代表本快的大小(包括块首)

  • 2-4字节表示计算单位是多少字节

不同点

  • Flags出 占用态标志是1  空闲态标志是 0

  • 空闲态块首后的八个字节为一对指针,分别是前向指针和后向指针。当堆块变为占用态的时候重新回分配数据。

  • 实际上尾块的起始位置是 0x360680

因此根据地址 0x360680处八个字节的情况可以知道:此尾块的大小是 0x130  计算单位是 0x0008 个字节  总大小是 0x980字节。


调试中识别堆的分配,释放,合并


堆块的分配







请到「今天看啥」查看全文