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

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;
}

之前,我认为局部变量的地址相同,因为它们都分配在同一堆栈区域和相同的内存地址中。但是当我在Stack Overflow上看到一篇关于ASLR的帖子时,我开始怀疑这可能是由于编译器的原因。有人可以解释一下吗?
编辑:我正在使用Windows 7。

2
不要使用“%d”来打印指针。 “%d”仅适用于打印int。而应该使用“%p”和显式转换为“void *”:printf(“%p”,(void *)ptr); - The Paramagnetic Croissant
也许考虑使用现代编译器?Turbo C++ 已经近十年没有更新了... - Nik Bougalis
@NikBougalis 我说过了,我也用过Dev C++。 - paul
@TheParamagneticCroissant 我会尝试。 - paul
@TheParamagneticCroissant 输出类似,只是以十六进制表示。 - paul
1
@PaulJabines 可能输出结果相似,但使用 %d 打印指针是未定义行为 - The Paramagnetic Croissant
2个回答

4

看起来你正在使用Windows操作系统。

引用自维基百科

微软的Windows Vista(2007年1月发布)及其后续版本仅为那些明确链接为ASLR启用的可执行文件和动态链接库启用ASLR。出于兼容性考虑,它不会默认启用其他应用程序的ASLR。通常,只有旧软件不兼容,可以通过编辑注册表项"HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages"来完全启用ASLR。

以及

基于主机的入侵防御系统(如WehnTrust和Ozone)还为Windows XP和Windows Server 2003操作系统提供ASLR。WehnTrust是开源的,但Ozone的实现细节不可用。

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


谢谢回答。因此,ASLR可以启用/禁用。 - paul
是的,您需要使用引号中描述的方法之一启用它,或者按照@nix所描述的方法进行操作。 - Mohit Jain

3

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

您的编译器是否支持ASLR?如果不支持,并且您正在使用Windows(根据您使用的编译器猜测),那么您可以尝试使用可以从Microsoft下载的EMET强制应用ASLR。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接