2

在得到这个答案的负面评论后 -我可以在 .text 区域中实现计数器而不使用寄存器吗?,我进行了一些调查,试图了解RWX内存页面是否真的是非常罕见的东西,或者每个流行的程序都有一些。(科学!

我通过 WinDBG 附加到 MSVS,执行!address /f:Image,PAGE_EXECUTE_READWRITE
我看到很多这样的行:

7a534000 7a537000     3000 MEM_IMAGE   MEM_COMMIT  PAGE_EXECUTE_READWRITE             Image "C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\6836a951700c2eb01a933212425cda4e\System.ni.dll"

我检查了它的部分,并且有一个.xdata带有“执行读写”标志的部分。

这是否意味着每个加载了 .NET 库的应用程序都有 RWX 内存页?
例如,您的浏览器(如果您运行 Windows)。(幸运的是,FF8 和 IE8 都不使用 .NET)

那么我们为什么要为 RWX 内存烦恼呢?

4

1 回答 1

1

我的直觉是,这可能不是问题。这可能是运行时环境支持动态行为所必需的。

可写和可执行的内存区域存在安全问题。这允许攻击者使用shellcode填充缓冲区,然后执行此代码。用 shellcode 填充缓冲区没什么大不了的,它只是数据。当攻击者能够控制指令指针(EIP)时,问题就出现了,通常是通过使用基于堆栈的缓冲区溢出来破坏函数的堆栈帧,然后通过将该指针分配给 shellcode(或在 nop 雪橇的某个地方,它将命中 shellcode)。

如果您想更好地了解此安全措施,请查看 NX 位出现之前的缓冲区溢出漏洞。您应该阅读经典论文 Smashing the Stack for Fun and Profit。请记住,由于 NX 位、ASLR 和金丝雀,这些攻击都不再有效。

于 2011-12-09T18:30:40.463 回答