如果我没弄错的话,每次运行程序时,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。
答案 0 :(得分:3)
有些事情会影响您的程序是否使用ASLR。在大多数情况下,您的编译器/链接器需要确保可执行文件是可重定位的,并将可执行文件标记为与ASLR兼容。那么你的操作系统需要在加载时实际重新定位它。
您的编译器是否支持ASLR?如果没有,并且您正在使用Windows(我猜测您是基于您正在使用的编译器),那么您可以尝试强制操作系统使用EMET应用ASLR,可以从微软下载。
答案 1 :(得分:3)
看来你正在使用Windows。
Microsoft的Windows Vista(2007年1月发布)以及之后的ASLR 仅启用那些可执行文件和动态链接库 特别链接到启用ASLR。 为了兼容性,默认情况下不会为其他人启用它 应用。 通常,只有较旧的软件不兼容,ASLR才能完全兼容 通过编辑注册表项启用 &#34; HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory 管理\ MoveImages&#34;
和
基于主机的入侵防御系统,如WehnTrust和 Ozone还为Windows XP和Windows Server 2003提供ASLR 操作系统。 WehnTrust是开源的完整细节 臭氧的实施不可用
确保启用ASLR以观察预期的行为。