我的问题是我尝试将内存分配给我制作的应用程序(x86)(通过链接器禁用了 ASLR),如下所示:
void* space = VirtualAllocEx(processHandle, LPVOID(0x400000),
0x20000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
和的返回值VirtualAllocEx
是NULL
(0)。如您所见,我尝试在地址空间 0x400000 中分配空间,这是可执行文件的默认虚拟地址空间。现在奇怪的是,这种内存分配适用于 ASLR,但它不适用于禁用 ASLR。
所以我的问题是:为什么会这样?我的意思是,为什么 ASLR 能让您在这样一个“关键”地址中分配空间?而且,为什么这种内存分配在没有 ASLR 的情况下会失败?这对现代系统没有安全威胁吗?
禁用 ASLR 后,您的代码将位于地址 0x400000 处,因此分配将失败。
启用 ASLR 后,您的代码可以在任何地方,因此此代码有时会(可能是大多数时候)工作,但有时会明显随机失败,这更糟。
解决方法:传lpAddress
为NULL,让系统决定分配去哪里。你为什么想做其他事情?
请注意,从安全角度(或实际上是其他任何角度)来看,地址 0x400000 没有什么特别之处。只是 Windows 碰巧在禁用 ASLR 的情况下将您的代码建立在那里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句