粉碎C ++ VPTR

时间:2014-11-25 11:22:29

标签: c++

我正在参加计算机安全课程,我正在阅读http://phrack.org/issues/56/8.html。 在bo3.cpp中,作者创建了自己的VTABLE,并覆盖VPTR以指向他的VTABLE。 要做到这一点,他需要VTABLE的地址,在这个例子中,它是对象的地址。 对我来说奇怪的是,所有这些都是在被利用的代码中执行的。我是初学者,但我认为这种技术不能在实践中使用,因为我们无法编辑源代码并重新编译它。有没有办法在代码之外构建VTABLE并覆盖VPTR(例如缓冲区溢出)(不编辑易受攻击的源代码)?

更新:让我们说易受攻击的程序要求输入字符串,我可以用它覆盖VPTR。我编写自己的代码,在其中创建VTABLE,并打印VTABLE地址。我运行我的代码并传递我的VTABLE地址(重复足够次以覆盖目标VPTR)作为易受攻击程序的字符串输入。这会有用吗?有更好/更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

是的,你可以使用这种技术。

在C ++中实现动态多态(虚拟继承)的常用方法是使用隐藏的vtable指针成员。然后该成员出现在具有虚函数的所有对象中。它通常位于物体的最开始处。

如果为对象调用虚函数,则程序从指向vtable的函数调用函数。因此,如果您设法用数据覆盖对象的开头,那么您可以使vtable指针指向其他位置,并实现其他操作而不是虚拟成员函数。

如果程序无权写入可执行内存(或执行可写内存),则无法使用该漏洞利用,但大多数广泛使用的操作系统并非如此。