不要问我为什么不在 Stack 上发布这个。所以我有这个小 C 程序。它返回 argv[1] 中指定的环境变量的地址。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
printf("%s is at %p\n", argv[1], getenv(argv[1]));
}
令人恼火的是,在 Ubuntu Linux 2.6.20-15 x86 上,每次运行程序时它都会返回相同的地址。
但在 Ubuntu Linux 3.2.0-37 x86 上,它每次都返回不同的地址。那么新内核有什么新特性呢?
答案1
Linux 内核具有一项功能,可对内存地址进行随机化以确保安全。其目的是防止可靠的缓冲区溢出攻击。您可能在一台机器上启用了该功能,但在另一台机器上没有启用。检查 sysctl 以了解如何启用和禁用它。