Deshabilitar la aleatorización de direcciones de memoria


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 frustra el propósito de esta comprobación rápida. ¿Hay alguna manera de desactivar esto temporalmente / permanentemente para que obtenga los mismos valores cada vez que ejecute el programa?

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

3 answers

En Ubuntu, se puede desactivar con...

echo 0 > /proc/sys/kernel/randomize_va_space

En Windows, este post podría ser de alguna ayuda...

Http://blog.didierstevens.com/2007/11/20/quickpost-another-funny-vista-trick-with-aslr/

 38
Author: Orbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-04 14:02:18

Para deshabilitar temporalmente ASLR para un programa en particular, siempre puede emitir lo siguiente (sin necesidad de sudo)

setarch `uname -m` -R ./yourProgram
 23
Author: Stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-14 05:06:56

También puede hacer esto programáticamente desde el código C antes de un UNIX exec.

Si echas 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 a una función (dependiendo de lo que su sistema defina). De 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 llama al mismo syscall anterior). Echa 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, desde el código C, llamar y establecer la personalidad para usar ADDR_NO_RANDOMIZE y luego exec (al igual que setarch hace).

#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 tal vez la carga dinámica), por lo que esto solo afecta tenedores y ejecutivos más tarde. Creo que los indicadores de aleatorización de direcciones son heredados por subprocesos hijos?

De todos modos, así es como puede desactivar programáticamente la aleatorización de direcciones en el código fuente de C. Esta puede ser su única solución si no desea forzar a un usuario a intervenir manualmente y comenzar con setarch o una 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 memoryand some IBM databases) need to be able to turn off randomization of memory addresses.

 4
Author: rts1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-21 22:26:19