web-dev-qa-db-fra.com

Désactiver la randomisation des adresses mémoire

J'essaye de déboguer un binaire qui utilise beaucoup de pointeurs. Parfois, pour voir rapidement la sortie pour déterminer les erreurs, j'imprime l'adresse des objets et leurs valeurs correspondantes, cependant, les adresses des objets sont aléatoires et cela va à l'encontre de l'objectif de cette vérification rapide. Existe-t-il un moyen de désactiver cela temporairement/définitivement afin que j'obtienne les mêmes valeurs chaque fois que j'exécute le programme.

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

33
0fnt

Sur Ubuntu, il peut être désactivé avec ...

echo 0 > /proc/sys/kernel/randomize_va_space

Sous Windows, cet article pourrait être utile ...

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

39
Orbit

Pour désactiver temporairement ASLR pour un programme particulier, vous pouvez toujours émettre ce qui suit (pas besoin de Sudo)

setarch `uname -m` -R ./yourProgram
27
Stephen

Vous pouvez également le faire par programme à partir d'une source C avant UNIX exec.

Si vous regardez les sources de setarch (voici une source):

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

Vous pouvez voir si cela se résume à un appel système (syscall) ou à un appel de fonction (selon ce que votre système définit). De setarch.c:

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

Sur mon système CentOS 6 64 bits, il semble qu'il utilise une fonction (qui appelle probablement le même syscall ci-dessus). Jetez un œil à cet extrait du fichier d'inclusion dans /usr/include/sys/personality.h (référencé comme <sys/personality.h> dans le code source setarch):

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

En résumé, vous pouvez, à partir du code C, appeler et définir la personnalité pour utiliser ADDR_NO_RANDOMIZE puis exec (comme le fait 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.
}

Il est assez évident que vous ne pouvez pas désactiver la randomisation des adresses dans le processus dans lequel vous êtes (grin: à moins que peut-être le chargement dynamique), donc cela n'affectera que les fourches et les exécutifs plus tard. Je crois que les indicateurs de randomisation d'adresse sont hérités par les sous-processus enfants?

Quoi qu'il en soit, c'est ainsi que vous pouvez désactiver par programme la randomisation d'adresse dans le code source C. Cela peut être votre seule solution si vous ne voulez pas forcer un utilisateur à intervenir manuellement et à démarrer avec setarch ou l'une des autres solutions répertoriées précédemment.

Avant de vous plaindre des problèmes de sécurité liés à la désactivation de cette option, certaines bibliothèques/outils de mémoire partagée (tels que mémoire partagée PickingTools et certains bases de données IBM ) doivent pouvoir désactiver la randomisation d'adresses mémoire.

5
rts1