标签:
我们在分析堆漏洞,如堆溢出、UAF等时常常会启用一些堆的调试支持。可能很多人都用过这些功能,比如gflags.exe,比如在分析UAF时使用的+UST +DPH等等。但是却很少有人了解这些东西到底是什么、是怎样发挥的作用。这里我就来讲解一下这几个调试机制。内容参考自《软件调试》,顺带说一句,个人感觉软件调试是一本不可多得的好书,作者不仅精通内核而且对用户层也有深入的了解,个人感觉可以和Windows Internal列为必看的书目了。
首先讲怎么开启堆调试机制,我们最熟悉的方法是使用gflags.exe /i 程序名.exe +具体的标志类型。但是事实上是从注册表中读取的相应进程名的键值。也就是说gflags无非就是在注册表中新建了键值。
在讲解具体的调试支持之前要明确一点,堆调试支持是由堆分配机制提供的。可能有些读者不太清楚堆分配与内存分配有什么区别。这里简单讲解一下,事实上,一个进程的虚拟地址空间是由一个“树”的数据结构进行描述的,分配一块虚拟内存就是在树上增加节点。而堆分配机制是先申请一块虚拟内存再利用自己的机制去分发这些内存。所以说堆是完全的应用层的行为,在内核来看,堆是不可见的,是透明的,内核只管进程虚拟地址的数据结构是怎么样的。
之前在读一些书的时候听到一个名词叫做调试堆,意思是调试下的堆与非调试下的堆是不一样的,哪里不一样也没能搞清楚。这次明白了,原来在调试状态下会自动启用htc hfc hpc。挂载进程后,在Windbg中用!gflag命令即可看到有哪些标志位。
标签:
原文地址:http://www.cnblogs.com/Ox9A82/p/5603172.html