RWX内存页面的风险

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

我通过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" 

我检查了它的部分,并且有“Execute Read Write”标志的.xdata部分。

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

那么,为什么我们打扰RWX记忆?

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

内存区域有可写和可执行的安全问题。 这允许攻击者用shellcode填充缓冲区,然后执行这个代码。 用shellcode填充缓冲区并不是什么大事,它只是数据。 当攻击者能够控制指令指针(EIP)时,通常通过使用基于堆栈的缓冲区溢出来破坏函数的堆栈帧,然后通过将该指针指派给shellcode的地址来改变执行流程在nop雪橇的某个地方将会碰到shellcode)。

如果你想更好地理解这个安全措施,那么看看在NX位出现之前,哪些缓冲区溢出会被利用。 你应该阅读经典文章, 粉碎堆栈的乐趣和利润 。 请记住,由于NX位,ASLR和金丝雀,这些攻击都不再有效。