实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows XP SP3 | |
虚拟机 | Vmware | |
调试器 | Windbg | 6.12 |
反汇编器 | IDA Pro | |
漏洞软件 | Windows Media Player | |
补丁比较工具 |
静态分析
动态分析
首先+hpa开启页堆。
在windbg中!gflag确认一下,然后拖入poc.avi。会触发异常中断。
kb回溯一下栈。
ub查看一下调用此函数的上一层代码。
由于iccvid.dll是在解析poc的时候才载入,所以为了在73b7cbee下断点,我们需要在加载该dll后中断。sxe ld:iccvid即可。
cid如果大于0x20会将一串数据的地址赋给esi。
据格式分析ebp+10的0x68为cvid数据长度。
CVID压缩格式:
在FrameHeader后是一些编码条,每一个编码条包含Header和CVID Chunk。
随后请看如下代码,如果chunk id=0x11就会执行往目标地址复制0x2000字节数据的操作,书中这里有误。ecx是0x800,但是他是reps movsd,一次复制4字节数据,所以需要0x800*4。
在73b722cc打一个断点进入第一次复制。
!heap -p -a edi查看当前堆块,发现是0x6000大小。
可以想象如果有3个0x11的strip就会溢出(这里有点奇怪 按照理论上来说第四个才溢出,但是书中写的>=3并且我个人也是第三次就出现Access violation,我的想法是其实df=0是正向,当第三次的时候其实edi就已经是边界地址了,所以看起来这里有0x6000大小,但是实际上只能进行两次0x11的chunk处理)。
总结
- !heap:查看堆相关信息
- 使用!heap -?查看帮助信息
- !heap -p:查看所有可能的handle值
- !heap -p -h HANDLE:查看对应HANDLE的详细分配信息
- !heap -p -a ADDR:显示具体某个堆块的详细信息
- dt STRUCTURE ADDR:按照STRUCTURE结构显示ADDR处结构体各成员值
- !gflag [-? | flags]指令用于堆调试,重点标志:htc, hfc, hpc, hpa
- sx:用于控制被调试程序发生某异常或特定事件时,调试器要采取的动作
- sxe ld:ModuleName 在首次加载ModuleName的时候中断。
文章评论
感觉文章显得比较窄,国庆过完后把之前的博客搬运过来