6

如果我没记错的话,每次运行程序时,ASLR 都会使 C 编译器中的局部变量具有不同的地址。但是当我在 Turbo C++ 和 Dev-CPP IDE 中尝试它时,它只是返回一个类似的局部变量地址。我试过的代码:

#include <stdio.h>
#include <conio.h>

int main()
{
 int x = 10;
 int *ptr = &x;
 printf("%d", ptr);
 getch();
 return 0;
}

以前,我认为局部变量的地址是相同的,因为它分配在同一个堆栈区域,因此是相同的内存地址。但是当我在 stackoverflow 中找到一个关于 ASLR 的线程时,它让我做了这些。我想这是因为编译器。任何人都可以对此有所了解吗?

编辑:

我使用的是 Windows 7。

4

2 回答 2

4

看来您正在使用 Windows。

引用自维基百科

Microsoft 的 Windows Vista(2007 年 1 月发布)及更高版本仅对那些专门链接为启用 ASLR 的可执行文件和动态链接库启用了 ASLR。为了兼容性,默认情况下不为其他应用程序启用它。通常,只有较旧的软件不兼容,并且可以通过编辑注册表项“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages”来完全启用 ASLR。

WehnTrust 和 Ozone 等基于主机的入侵防御系统还为 Windows XP 和 Windows Server 2003 操作系统提供 ASLR。WehnTrust 是开源的 Ozone 实施的完整细节不可用

确保启用 ASLR 以观察预期行为。

于 2014-08-04T07:09:42.117 回答
3

有几件事会影响您的程序是否使用 ASLR。在大多数情况下,您的编译器/链接器需要确保可执行文件是可重定位的,并将可执行文件标记为与 ASLR 兼容。然后您的操作系统需要在加载时实际重新定位它。

你的编译器支持 ASLR 吗?如果不是,并且您使用的是 Windows(我猜您是基于您正在使用的编译器),那么您可以尝试强制操作系统使用 EMET 应用 ASLR,您可以从 Microsoft 下载。

于 2014-08-04T07:07:38.003 回答