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