这个洞是在论坛里看到的,感觉很有意思,来学习一下。个人感觉IE或者说是浏览器的洞和Adobe洞都是比较难调的,主要是有大量的类难以摸清之间的关系。
这个洞是一个整数溢出的洞,这个不是重点。重点是利用的思路,利用思路是挖坑法,即所谓的make hole,通过挖坑来泄漏dll的基址,然后再加以利用。make hole并不是独门绝技,这种方法在IE和Adobe的漏洞利用中都有出现(主要是因为可以嵌入js,实现自由分配内存?),但是我觉得这种方法还是很巧妙的,就像大牛说的是一种比较优雅的手法。尤其是对内存的精准控制,个人感觉是一种艺术:)
漏洞的关键点如图所示,xpos和ypos的来自于pdf文件中,其中如果xpos在文件中的初始值为0xff那么经过运算后为可控制为0xFFFFFFF8
而这里xpos是当作有符号数来运算的,就是说有符号数发生了上溢成了负数(注意,此堆块称为texture)。下面来看exp作者是怎么利用这个整数溢出的。
作者首先控制texture的大小为0x130字节(texture大小可由xpos和ypos控制),然后在内存中利用js分配大量的0x130个字节大小的字符串对象,然后间隔的释放字符串对象实现挖坑。这时texture就会落在坑中。通过整数溢出向此堆头的8个字节写入,致使reader释放了前一个0x130大小的字符串对象。然后reader会创建一个0x130大小的imgstruct,这个结构中包含有虚表指针。由于js在分配字符串对象时保有指针,那么这时就可以直接读出虚表地址。通过虚表地址可以获得AcroRd32.dll模块的基址,这就实现了绕过aslr。然后通过释放imgstruct的内存,再在poc中分配布置了伪虚表的堆块来占位,通过js语句使reader调用imgstruct的虚表实现控制了EIP。然后利用就是换栈的堆喷了。最后附一张大牛写的总结