c++ - 粉碎 C++ VPTR

标签 c++

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

更新:假设易受攻击的程序要求输入字符串,我可以用它覆盖 VPTR。我编写自己的代码,在其中创建一个 VTABLE,并打印 VTABLE 地址。我运行我的代码并将我的 VTABLE 地址(重复足够多次以覆盖目标 VPTR)作为字符串输入传递给易受攻击的程序。这行得通吗?有没有更好/更简单的方法来做到这一点?

最佳答案

是的,你可以使用这个技巧。

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

如果为对象调用虚函数,则程序会调用指向虚表的函数。因此,如果您设法用您的数据覆盖对象的开头,那么您可以使 vtable 指针指向其他任何地方,并实现执行其他内容而不是虚拟成员函数。

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

关于c++ - 粉碎 C++ VPTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27125303/

相关文章:

c++ - g++ 在 osx 上使用 -O3 优化错误

c++ - mingw make 文件指南 mingw32-make

c++ - IDirect3DDevice9::Reset 异常的原因可能是什么?

c++ - KeyboardProc 回调函数没有被调用?

c++ - 理解c++代码; *datatype 和 classname::method 是什么意思?

javascript - 如何使用 Emscripten 将对象从 Javascript 传递到 C++

c++ - 指向函数的指针不会编译

c++ - C/C++ 将 64 位整数转换为字符数组

c++ - 我的 is_complete 类型特征的实现是否暴露了编译器错误?

c++ - 对于 char d,我在执行 cout << &d 时得到奇怪的输出