我正在上一门计算机安全课,我正在读http://phrack.org/issues/56/8.html。在bo3.cpp中,作者创建自己的VTABLE,并覆盖VPTR以指向他的VTABLE。为此,他需要VTABLE的地址,在本例中,VTABLE是对象的地址。让我感到奇怪的是,所有这些都是在被利用的代码中执行的。我是一个初学者,但我认为这种技术不能在实践中使用,因为我们不能编辑源代码并重新编译它。有没有办法在代码之外构建VTABLE并覆盖VPTR (例如,使用缓冲区溢出)(而不编辑易受攻击的源代码)?
更新:假设易受攻击的程序要求输入字符串,我可以用它覆盖VPTR。我编写自己的代码,在其中创建一个VTABLE,并打印VTABLE地址。我运行代码并将我的VTABLE地址(重复次数足以覆盖目标VPTR)作为字符串输入传递给易受攻击的程序。这样行得通吗?有没有更好/更简单的方法来做到这一点?
发布于 2014-11-25 22:18:57
是的,你可以使用这种技术。
在C++中实现动态多态性(虚拟继承)的常见方式是使用隐藏的vtable指针成员。然后,该成员出现在所有具有虚拟函数的对象中。它通常位于对象的最开始处。
如果为object调用了一个虚函数,那么程序将从指向vtable的那个虚函数中调用一个函数。因此,如果你设法用你的数据覆盖object的开头,那么你可以让vtable指针指向其他任何地方,并实现执行一些其他的东西,而不是虚拟成员函数。
如果程序没有写入可执行存储器(或执行可写存储器)权限,则不可能利用该漏洞,但大多数广泛使用的操作系统并非如此。
https://stackoverflow.com/questions/27125303
复制相似问题