码迷,mamicode.com
首页 > 其他好文 > 详细

漏洞分析中常用的堆调试支持

时间:2016-06-21 12:14:50      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

  我们在分析堆漏洞,如堆溢出、UAF等时常常会启用一些堆的调试支持。可能很多人都用过这些功能,比如gflags.exe,比如在分析UAF时使用的+UST +DPH等等。但是却很少有人了解这些东西到底是什么、是怎样发挥的作用。这里我就来讲解一下这几个调试机制。内容参考自《软件调试》,顺带说一句,个人感觉软件调试是一本不可多得的好书,作者不仅精通内核而且对用户层也有深入的了解,个人感觉可以和Windows Internal列为必看的书目了。

  首先讲怎么开启堆调试机制,我们最熟悉的方法是使用gflags.exe /i 程序名.exe +具体的标志类型。但是事实上是从注册表中读取的相应进程名的键值。也就是说gflags无非就是在注册表中新建了键值。

技术分享

  在讲解具体的调试支持之前要明确一点,堆调试支持是由堆分配机制提供的。可能有些读者不太清楚堆分配与内存分配有什么区别。这里简单讲解一下,事实上,一个进程的虚拟地址空间是由一个“树”的数据结构进行描述的,分配一块虚拟内存就是在树上增加节点。而堆分配机制是先申请一块虚拟内存再利用自己的机制去分发这些内存。所以说堆是完全的应用层的行为,在内核来看,堆是不可见的,是透明的,内核只管进程虚拟地址的数据结构是怎么样的。

  之前在读一些书的时候听到一个名词叫做调试堆,意思是调试下的堆与非调试下的堆是不一样的,哪里不一样也没能搞清楚。这次明白了,原来在调试状态下会自动启用htc hfc hpc。挂载进程后,在Windbg中用!gflag命令即可看到有哪些标志位。

      • hfc:是用来防止二次释放的,如果发生了二次释放的话,二次释放会被阻止。如果此时有调试器挂载,那么就会抛出一个断点。
      • ust:用来追踪堆的分配过程。很多时候我们找到了一块堆内存,却不知道这个堆内存是谁分配的。ust就是用来解决这个问题的,ust有自己的一块内存区作为数据库。每次堆分配函数被调用时,分配函数的栈回溯都会被保存进数据库,这样,想知道堆是谁分配的就可以看栈回溯了。

漏洞分析中常用的堆调试支持

标签:

原文地址:http://www.cnblogs.com/Ox9A82/p/5603172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!