C编译器中的地址空间布局随机化

时间:2014-08-04 07:00:10

标签: c memory-management aslr

如果我没弄错的话,每次运行程序时,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。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

看来你正在使用Windows。

引自wikipedia

  

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以观察预期的行为。