实验环境
| 推荐使用的环境 | 备注 | |
|---|---|---|
| 操作系统 | Windows 7 SP1 | |
| 虚拟机 | Vmware | |
| 调试器 | Windbg | |
| 反汇编器 | IDA Pro | |
| 漏洞软件 | Windows Fax Cvoer Page Editor | 
动态分析
栈回溯显然不正常,估计又是符号表和版本出的问题,所以不自己动态分析了,直接看书。

后续静态分析发现果然是SP1的补丁把漏洞修复了。。。
然后发现属性里面有个恢复旧版本,旧版本的果然正常了。

静态分析
书上的栈显然能看出是析构函数调用free出的问题。

补丁分析的时候也主要看CDrawDoc的函数就行了。

补丁增加的函数如下,便利CPtrList中的指针,判断对象是否被序列化,如果未被序列化,就从列表中移除索引到的对象。


总结
很容易分析到第二次释放在哪里产生,但是第一次释放呢?想了想,可以在free处打断点,heap free之前打印一下堆栈,然后根据地址ctrl + f就行了。如果堆块是固定一个,是否对堆首下写入断点或者访问断点也可以?
文章评论