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

n1k*_*ita 1 c++ security vtable

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

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

Mar*_*k B 7

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

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

  • FWIW:vtable确实在我知道的任何地方的可写内存中.原因是通常它们包含的函数是动态绑定的.从单独的共享库中定义的类派生是合法的,因此vtbl中的指针将依赖于运行时.我确信可以为静态二进制文件创建纯静态vtbl,但我不知道有谁做过. (2认同)