我知道 vtables 以只读方式存储在内存中以防止修改。哪个部分恰好存储 vtables?
另一个问题,根据vtables的只读权限,它们是如何在exploit编写过程中被修改的?
您从哪里得到 vtable 存储在只读内存中的想法?vtable 实现完全是编译器定义的,不能保证它们是只读的。我会想象在许多实现中它们可能存储在可写内存中,例如如果写保护不可用。
即使 vtable 本身是写保护的,也没有理由不能更改对象实例中的 vtable 指针以指向您选择的看起来像真正 vtable 的内存,并利用它跳转到不同的函数。
首先,虚方法表是大多数 C++ 编译器的实现细节。此外,标准没有强制编译器将虚拟表存储在只读内存中(这很清楚,考虑到 C++ 根本不需要目标硬件架构具有只读内存)。因此,并非所有编译器都这样做;其中一些可能会,有些可能不会——即使只读内存可用。
接下来,假设在某些系统上,某些C++ 编译器使用 vtables 并声明它们以供可执行加载器加载到只读内存中:如果加载器能够将内存状态更改为只读,则在某些体系结构上,程序具有足够的权限也许可以把它改回来。但是,如果内存在物理上是只读的,那么即使是可执行加载程序也无法修改它,因此程序必须存在于 ROM 的某个变体中。这绝对是可能的,在这种情况下(受硬件保护的只读存储器)没有办法恶意覆盖它。