现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

常态堆与调试态堆的区别

2014-03-26 05:41 工业·编程 ⁄ 共 847字 ⁄ 字号 暂无评论
文章目录

        看过《0day安全:软件漏洞分析技术》的童鞋们都知道在内存中的堆分两种情况,一种为常态堆,另一种为调试态堆。但自己以前在调试的时候并没有深刻领会到这一点。今天在调试的时候偶然间深刻领会到这一点。下面分两种情况来查看堆块的内存结构:

1. 常态堆

先打开PowerPoint,然后用Windbg附加,运行。随便打开一个ppt文件。中断后在Windbg命令栏里输入扩展命令!heap查看进程所有的堆。

选择一个堆里的地址,打开Memory窗口,观察一下这个地址的前后,很容易就找到该堆块的头部起始地址。我试验的地址是0x03dc8900。输入扩展命令查看该堆块的块首信息,当然如果熟练的话,可直接从内存里看就行。

                        图1 常态堆块的块首示意图

从图中我们可以看出Flag标记为0x1,表示该堆块为占用态。堆块的大小为4个单位,一个堆单位为8个字节。再从Memory窗口查看整个完整的堆块,如下图

                        图2 常态堆块整个示意图

可以看出堆块的末尾没有填充字符。

2.调试态堆

用Windbg打开PowerPoint,运行。再打开一个ppt文件。中断后按照上面的步骤查看一个堆块的内存结构:

                       图3 调试态堆块的块首示意图

从中我们可以看出Flag标记变成了0x7,二进制码为0111,左边第一个1表示该堆块处于调试态(Fill Pattern)。右边第一个1表示堆块处于占用态。

整个堆块内存如下:

                        图4 常态堆块整个示意图

堆的末尾从038e7e48开始有16个字节的填充,8个ab和8个00,用来防止溢出。

总结:常态堆和调试态堆管理策略有很大的差异,我们在进行漏洞调试的时候,如果涉及到堆的话,最好不要用调试器打开进程而选择Attach,因为程序会检测到进程处于调试状态。

一点点小收获,拿出来跟大家分享,请大虾们莫见笑。。。   :)

作者:把梦想放飞

给我留言

留言无头像?