4.4.2 Windows堆块的管理结构

“哦!0x34343434是我们构造的数据吧?”大家高兴的说,“那我们又可以控制把任意东西写进任意位置了啊?”

“是啊,但为什么要把‘Buf2’的管理结构填成\x03\x00\x05\x00\x00\x09这么奇怪的数呢?”宇强又发现了问题。

“嗯,观察得很仔细。因为在Windows下堆管理有很多分支,所以堆的溢出也非常复杂。Windows系统在作释放处理时,将根据堆块管理结构的数据来进入不同流程的处理。”

“哦!”

“所以,如果我们想要在Buf2释放时能控制what和where的值,并能执行what→where的操作,那就需要精心构造‘Buf2’的管理结构!”

“堆块的管理结构都是8个字节, 每个字节的含义如图4-44。”

“要达到我们的目的,产生what→where的操作,就需要让‘Buf2’的管理结构满足下面的条件。”老师说。

“第一,要让‘索引号’段的值小于0x40;第二,要让‘Flag’的第0位和第三位都置1,如图4-45。”

小知识:Flag段每位的含义

0x01 - HEAP_ENTRY_BUSY

0x02 - HEAP_ENTRY_EXTRA_PRESENT

0x04 - HEAP_ENTRY_FILL_PATTERN

0x08 - HEAP_ENTRY_VIRTUAL_ALLOC

0x10 - HEAP_ENTRY_LAST_ENTRY

0x20 - HEAP_ENTRY_SETTABLE_FLAG1

0x40 - HEAP_ENTRY_SETTABLE_FLAG2

0x80 - HEAP_ENTRY_SETTABLE_FLAG3