为什么 macOS 上的动态链接库似乎禁用了 ASLR?
Why does ASLR appear to be disabled for dynamically-linked libraries on macOS?
如果我没记错的话,下面的代码应该在每次 运行 时打印出 不同的 个地址。但是,它始终显示 isupper
的相同地址(例如)。
代码:
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char *argv[]) {
printf("isspace @ %p\n", dlsym(RTLD_DEFAULT, "isspace"));
return 0;
}
输出:
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
(我 运行ning macOS 10.14.6,但我在另一台计算机 运行ning macOS 10.15 上测试了相同的代码,结果相同。)
我错过了什么?
作为一项优化,macOS 为许多系统库使用共享映射。它们在启动时加载一次并被所有进程使用。对于给定的引导,地址在所有此类进程中都是恒定的。但是,为了安全起见,地址在每次启动时都是随机的。
如果我没记错的话,下面的代码应该在每次 运行 时打印出 不同的 个地址。但是,它始终显示 isupper
的相同地址(例如)。
代码:
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char *argv[]) {
printf("isspace @ %p\n", dlsym(RTLD_DEFAULT, "isspace"));
return 0;
}
输出:
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
$ ./libc-simple
isspace @ 0x7fff76b63035
(我 运行ning macOS 10.14.6,但我在另一台计算机 运行ning macOS 10.15 上测试了相同的代码,结果相同。)
我错过了什么?
作为一项优化,macOS 为许多系统库使用共享映射。它们在启动时加载一次并被所有进程使用。对于给定的引导,地址在所有此类进程中都是恒定的。但是,为了安全起见,地址在每次启动时都是随机的。