虚拟表真的存储在哪里,为什么我们不能修改它们?

时间:2012-08-23 17:16:10

标签: c++ security vtable

我知道vtable在内存中以只读方式存储,以防止修改。哪个部分正好存储vtables?

另一个问题,根据vtable的只读权限,如何在漏洞利用写入过程中修改它们?

2 个答案:

答案 0 :(得分:7)

你在哪里知道vtable存储在只读内存中? vtable实现完全由编译器定义,并且不保证它们是只读的。我想在很多实现中它们可能存储在可写存储器中,例如,如果写保护不可用。

即使vtable本身是写保护的,也没有理由不能将对象实例中的vtable指针更改为指向您选择的看起来像真实vtable的内存,利用它来跳转到不同的函数。

答案 1 :(得分:3)

首先,虚方法表是大多数C ++编译器的实现细节。此外,标准的编译器强制将虚拟表存储在只读存储器中(这很明显,考虑到C ++不需要目标硬件架构 只读内存。所以并非所有编译器都这样做;其中一些可能会做,有些可能不会 - 即使只读内存可用。

接下来,假设在某些系统某些 C ++编译器使用vtables并声明它们将可执行加载器加载到只读内存中:如果加载器能够将内存状态更改为只读,在某些体系结构上,具有足够权限的程序可能能够将其更改回来。但是,如果内存是物理上只读的,那么即使是可执行加载程序也无法修改它,因此程序必须存在于ROM的某种变体中。这绝对是可能的,在这种情况下(硬件保护的只读内存),无法恶意覆盖它。