实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 SP1 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | Windows Fax Cvoer Page Editor |
动态分析
栈回溯显然不正常,估计又是符号表和版本出的问题,所以不自己动态分析了,直接看书。
后续静态分析发现果然是SP1的补丁把漏洞修复了。。。
然后发现属性里面有个恢复旧版本,旧版本的果然正常了。
静态分析
书上的栈显然能看出是析构函数调用free出的问题。
补丁分析的时候也主要看CDrawDoc的函数就行了。
补丁增加的函数如下,便利CPtrList中的指针,判断对象是否被序列化,如果未被序列化,就从列表中移除索引到的对象。
总结
很容易分析到第二次释放在哪里产生,但是第一次释放呢?想了想,可以在free处打断点,heap free之前打印一下堆栈,然后根据地址ctrl + f就行了。如果堆块是固定一个,是否对堆首下写入断点或者访问断点也可以?
文章评论