首先是寻找漏洞存在的原因
经过资料知道漏洞点在 30ed442c这个位置,由于在解析pFragments属性值时候没有计算内存空间大小,存在栈溢出。
现在需要更多的细节,固打开WinDgb 进行调试。
此处可以看到以下几个值 eax的值来自于POC的样本数据
接着ecx取出eax的值并且执行右移两位的操作
于是理论上这个空间的大小是ffff进行右移4位,也就是3FFF,实际上用不了这么大。
内存的起始读入在edi 也就是00123dc0.
我们可以轻松的定位到ebp下方的返回地址
然而这里并不是这个会崩溃的函数的返回地址。事实上这个函数的返回地址再上面 即00123da0
所以并不能够覆盖到这个地址。
但是控制EIP就必须要控制跳转。于是进入下面的函数进行分析、
首先来到30F0B5FB这个地址,发现下面有一个call 地址在30f0b611,这个我们姑且叫做检验函数。
进入这个函数,分析发现地址位于30f0b7c6的函数进入程序会报错,必须不让它跳过。
来到下面地址为30D0B7C6 分析发现这个跳转发生后有一个可以跳转到任意位置的CALL 地址为30F0B7E5
于是我们只需要构造适当的exp就可以达到控制EIP的目的。