volumen significa que puedo puedes puede porque instalar está este esta disco disable corestorage convirtiendo macos osx-mavericks aslr

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?