Почему ASLR отключен для динамически связанных библиотек в macOS? - PullRequest
0 голосов
/ 22 февраля 2020

Если я не ошибаюсь, следующий код должен распечатывать разные адреса при каждом запуске. Однако он всегда отображает один и тот же адрес для 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

(я работаю macOS 10.14.6, но я тестировал тот же код на другом компьютере под управлением macOS 10.15 с тем же результатом.)

Чего мне не хватает?

1 Ответ

2 голосов
/ 22 февраля 2020

В качестве оптимизации macOS использует общее отображение для многих системных библиотек. Они загружаются один раз при загрузке и используются всеми процессами. Для данной загрузки адрес постоянен во всех таких процессах. Тем не менее, адрес рандомизируется при каждой загрузке в целях безопасности.

...