macos - significa - ¿Manera documentada de deshabilitar ASLR en OS X?
que significa corestorage (1)
En OS X 10.9 (Mavericks), es posible deshabilitar la aleatorización del diseño del espacio de direcciones para un proceso único si posix_spawn()
el proceso llamando a posix_spawn()
y pasando el atributo no documentado 0x100
. Me gusta esto:
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);
(Esto es ingeniería inversa de las fuentes GDB de Apple .)
El problema con características no documentadas como esta es que tienden a desaparecer sin previo aviso. De acuerdo con esta respuesta de desbordamiento de pila, el enlazador dinámico utilizado para consultar la variable de entorno DYLD_NO_PIE
, pero esto no funciona en 10.9; De manera similar, el enlazador estático aparentemente se usa para tomar la --no-pie
, pero este ya no es el caso.
Entonces, ¿hay una forma documentada de deshabilitar ASLR?
(La razón por la que necesito deshabilitar ASLR es para garantizar la repetibilidad, al probar y depurar, el código cuyo comportamiento depende de las direcciones de los objetos, por ejemplo, tablas hash basadas en direcciones y BIBOP-based memoria BIBOP-based ).
En realidad, todavía hay una bandera del enlazador -no_pie
, pero podrías haber pensado que en realidad se llama --no-pie
.
Vamos a tener un pequeño programa de prueba:
#include <stdio.h>
const char *test = "test";
int main() {
printf("%p/n", (void*)test);
return 0;
}
Y compilar como de costumbre primero:
cc -o test-pie test-pie.c
Y mira las banderas
$ 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
Bien, hay una bandera PIE
ahí, verifiquemos
$ for x in $(seq 1 5); do echo -n "$x "; ./test-pie; done
1 0x10a447f96
2 0x10e3cbf96
3 0x1005daf96
4 0x10df50f96
5 0x104e63f96
Eso parece bastante aleatorio.
Ahora, digamos al vinculador que no queremos que PIE
use -Wl,-no_pie
:
cc -o test-nopie test-pie.c -Wl,-no_pie
Efectivamente, la bandera de PIE
se ha ido:
$ 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
Y prueba:
$ for x in $(seq 1 5); do echo -n "$x "; ./test-nopie; done
1 0x100000f96
2 0x100000f96
3 0x100000f96
4 0x100000f96
5 0x100000f96
Así que hacemos que el enlazador no agregue el indicador PIE
, y mi sistema Mavericks parece seguir cumpliéndolo.
FWIW, el indicador PIE
está definido y documentado en /usr/include/mach-o/loader.h
como MH_PIE
.
Existen herramientas en todo Internet para borrar el indicador PIE de los binarios existentes, por ejemplo, http://src.chromium.org/svn/trunk/src/build/mac/change_mach_o_flags.py
Si bien no puedo ofrecerle una forma documentada de iniciar un binario con PIE
sin ASLR, ya que desea probar el código, probablemente el suyo, ¿solo -no_pie
vincular sus programas de prueba con -no_pie
o quitar la -no_pie
PIE
de sus binarios de prueba?