tag picard musicbrainz mac kid3 español editar easytag linux memory-address aslr

linux - mac - musicbrainz picard español



Deshabilitar la aleatorización de direcciones de memoria (3)

Estoy tratando de depurar un binario que usa muchos punteros. A veces, para ver la salida rápidamente para descubrir 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 propósito de esta rápida comprobación. ¿Hay alguna manera de deshabilitar esto temporalmente / permanentemente para que obtenga los mismos valores cada vez que ejecuto el programa?

Ups. El sistema operativo es Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux



Para deshabilitar temporalmente ASLR para un programa en particular, siempre puede emitir lo siguiente (no necesita sudo)

setarch `uname -m` -R ./yourProgram


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

Si 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 del sistema ( syscall ) o una llamada de función (según lo que defina su sistema). Desde setarch.c:

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

En mi sistema CentOS 6 de 64 bits, parece que usa una función (que probablemente se llama la misma syscall de arriba). Eche 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 de setarch):

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

Lo que se reduce a, es que puede, desde el código C, llamar y configurar la personalidad para usar ADDR_NO_RANDOMIZE y luego exec (tal como lo hace 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 puede desactivar la aleatorización de direcciones en el proceso en el que se encuentra (sonrisa: a menos que sea una carga dinámica), por lo que esto solo afecta a las bifurcaciones y los ejecutivos más adelante. ¿Creo que los indicadores de aleatorización de direcciones son heredados por subprocesos secundarios?

De todos modos, así es como se puede desactivar mediante programación la asignación aleatoria de direcciones en el código fuente C. Esta puede ser su única solución si no desea que la fuerza de un usuario intervenga manualmente y comience con setarch o alguna de las otras soluciones enumeradas anteriormente.

Antes de quejarse de los problemas de seguridad al desactivar esto, algunas bibliotecas / herramientas de memoria compartida (como la memoria compartida de PickingTools y algunas bases de datos de IBM ) deben poder desactivar la asignación aleatoria de direcciones de memoria.