2011-03-04 7 views
27

Estoy intentando depurar un binario que usa muchos punteros. Algunas veces, para ver la salida rápidamente para descifrar los errores, imprimo la dirección de los objetos y sus valores correspondientes, sin embargo, las direcciones de los objetos son aleatorias y esto anula el objetivo de esta revisión rápida. ¿Hay alguna manera de desactivar esto temporalmente/permanentemente para que obtenga los mismos valores cada vez que ejecuto el programa?Desactivar la aleatorización de las direcciones de memoria

Vaya. OS es Linux fsttcs1 2.6.32-28-generiC#55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

+1

¿Qué sistema operativo? ...... – Orbit

+0

relacionado http://stackoverflow.com/questions/11238457/disable-and-re-enable-address-space-layout-randomization-only-for-myself –

Respuesta

20

Para desactivar temporalmente ASLR para un programa en particular, siempre puede emitir lo siguiente (no es necesario sudo)

setarch `uname -m` -R ./yourProgram 
+2

Encontré que 'setarch' encuentra desagradable la salida de' uname -m' en los sistemas ARM (por ejemplo, Raspberry Pi). Pero 'setarch linux32 -R./YourProgram' funciona muy bien. –

+4

Una buena variante es 'setarch \' uname -m \ '-R $ SHELL'. Eso genera un shell con ASLR deshabilitado, y cualquier comando que ejecute desde ese shell también tendrá ASLR deshabilitado. – ntc2

+0

¡Qué bueno! ¡Me gusta mucho eso! – Stephen

2

También puede hacerlo mediante programación desde la fuente C antes de UNIX exec.

Si se echa un vistazo a las fuentes de setarch (aquí hay una fuente):

http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c

Puede ver si se reduce a una llamada al sistema (syscall) o una llamada de función (dependiendo de lo su sistema lo define). De setarch.c:

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

En mi 6 sistema de 64 bits de CentOS, parece que utiliza una función (que probablemente llama a la llamada al sistema de auto-mismo más arriba). Echar un vistazo a este fragmento del archivo de inclusión en /usr/include/sys/personality.h (como se hace referencia como <sys/personality.h> en el código fuente setarch):

/* Set different ABIs (personalities). */ 
extern int personality (unsigned long int __persona) __THROW; 

Lo que se reduce a, es que se puede, a partir del código C, llamada y establecer el personalidad para usar ADDR_NO_RANDOMIZE y luego exec (al igual que setarch).

#include <sys/personality.com> 

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

... 

void mycode() 
{ 
    // If requested, turn off the address rand feature right before execing 
    if (MyGlobalVar_Turn_Address_Randomization_Off) { 
    personality(ADDR_NO_RANDOMIZE); 
    } 
    execvp(argv[0], argv); // ... from set-arch. 
} 

Es bastante obvio que no se puede convertir la aleatorización dirección de apagado en el proceso que se encuentra (sonrisa: a menos de carga dinámica tal vez), así que esto sólo afecta a los tenedores y los ejecutivos más tarde. Creo que las banderas de aleatorización de direcciones son heredadas por subprocesos secundarios.

De todos modos, así es como puedes desactivar programáticamente la aleatorización de direcciones en el código fuente C. Esta puede ser su única solución si no desea que forzar a un usuario a intervenir de forma manual y se inicie con el setarch o alguna de las otras soluciones enumeradas anteriormente.

Antes de quejarse de problemas de seguridad al desactivar esto, algunas bibliotecas/herramientas de memoria compartida (como PickingTools shared memory y algunas IBM databases) deben poder desactivar la aleatorización de direcciones de memoria.

Cuestiones relacionadas