堆调试技巧
- 微软为了帮助程序员快速找到内存错误导致的BUG,在堆管理器中提供了一些调试选项用于辅助堆调试,下面是一些常见的调试选项,可以通过Windbg 提供的gflags.exe 来设置。
- htc - 堆尾检查,在堆块末尾附加额外的标记信息(通常为8字节),用于检查是否发生溢出。
- hfc-堆释放检查,在释放堆块时对堆进行各种检查,防止多次释放同一个堆块。
- hpc-堆差数检查,对传递给堆管理的参数进行更多的检查。
- ust-用户态栈回溯,即将每次调用堆函数的函数调用信息记录到一个数据库中。
- htg-堆标志,为堆块增加附加标志,以记录堆块的使用情况和其他信息。
- hvc-调用时验证,即每次调用堆函数是都对整个堆进行验证和检查。
- hpa-启用页堆,在堆块后增加专门用于检查溢出的栅栏页,若发生堆溢出触及栅栏页便会立刻触发异常。
- 比如要针对app.exe程序添加堆尾检查功能和页堆,去除堆标志,可以执行以下命令:
gflags.exe -i app.exe +ptc +hpa -htg
在堆漏洞调试中,较为常用的是htc.hpc.hfc和hpa。
- 不过我自己在调试中,使用windbg设置条件时,!gflag命令并没有执行,也没有去找什么原因,我直接用gflags.exe来实现。
参考《漏洞战争》