Подтвердить что ты не робот

Документированный способ отключения ASLR для OS X?

В OS X 10.9 (Mavericks) можно отключить рандомизацию расположения пространства адресов для одного процесса, если вы запустите процесс путем вызова posix_spawn() и передать недокументированный атрибут 0x100. Вот так:

extern char **environ;
pid_t pid;
posix_spawnattr_t attr;

posix_spawnattr_init(&attr);
posix_spawnattr_setflags(&attr, 0x100);
posix_spawn(&pid, argv[0], NULL, &attr, argv, environ);

(Это реконструировано из Источники Apple GDB.)

Проблема с недокументированными функциями вроде этого заключается в том, что они, как правило, исчезают без предупреждения. В соответствии с этот ответ динамический компоновщик dyld, используемый для консультаций с переменная окружения DYLD_NO_PIE, но это не работает в 10.9; аналогичным образом статический линкер, по-видимому, использовал параметр --no-pie, но это уже не так.

Итак, существует документированный способ отключения ASLR?

(Причина, по которой мне нужно отключить ASLR, заключается в обеспечении повторяемости при тестировании и отладке кода, поведение которого зависит от адресов объектов, например хэш-таблиц на основе адресов и Менеджеры памяти на базе BIBOP.)

4b9b3361

Ответ 1

На самом деле все еще существует флаг -no_pie, но вы могли подумать, что он на самом деле называется --no-pie.

Позволяет иметь небольшую тестовую программу:

#include <stdio.h>

const char *test = "test";

int main() {
  printf("%p\n", (void*)test);
  return 0;
}

И сначала скомпилируйте как обычно:

cc -o test-pie test-pie.c

И проверьте флаги

$ otool -hv test-pie
test-pie:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL LIB64     EXECUTE    16       1376   NOUNDEFS DYLDLINK TWOLEVEL PIE

Хорошо, есть флаг PIE, пусть проверяет

$ for x in $(seq 1 5); do echo -n "$x "; ./test-pie; done
1 0x10a447f96
2 0x10e3cbf96
3 0x1005daf96
4 0x10df50f96
5 0x104e63f96

Это выглядит достаточно случайным.

Теперь давайте расскажем линкеру, что мы не хотим PIE, используя -Wl,-no_pie:

cc -o test-nopie test-pie.c -Wl,-no_pie

Конечно, флаг PIE отсутствует:

$ otool -hv test-nopie
test-pie:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL LIB64     EXECUTE    16       1376   NOUNDEFS DYLDLINK TWOLEVEL

И тест:

$ for x in $(seq 1 5); do echo -n "$x "; ./test-nopie; done
1 0x100000f96
2 0x100000f96
3 0x100000f96
4 0x100000f96
5 0x100000f96

Итак, мы делаем компоновщик не добавляем флаг PIE, и моя система Mavericks, похоже, все еще соблюдает его.

FWIW, флаг PIE определяется и документируется в /usr/include/mach-o/loader.h как MH_PIE.

Есть инструменты по всему Интернету, чтобы очистить флаг PIE от существующих двоичных файлов, например. http://src.chromium.org/svn/trunk/src/build/mac/change_mach_o_flags.py

Хотя я не могу предложить вам документированный способ запустить двоичный файл PIE без ASLR, так как вы хотите протестировать код, предположительно свой собственный, просто связав ваши тестовые программы с -no_pie или удалив флаг PIE после этого из ваших тестовых двоичных файлов должно быть достаточно?