40 votes

Désactiver la randomisation des adresses mémoire

J'essaie de déboguer un binaire qui utilise beaucoup de pointeurs. Parfois, pour voir la sortie rapidement afin de trouver 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/permanemment 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

47voto

Orbit Points 6928

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

echo 0 > /proc/sys/kernel/randomize_va_space

Pour Windows, ce billet pourrait être utile...

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

38voto

Stephen Points 504

Pour désactiver temporairement l'ASLR pour un programme particulier, vous pouvez toujours faire ce qui suit (pas besoin de sudo)

setarch `uname -m` -R ./yourProgram

9voto

rts1 Points 286

Vous pouvez également effectuer cette opération de manière programmatique à partir d'une source C avant un système 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 que cela se résume à un appel système ( syscall ) ou un appel de fonction (selon la définition de votre système). Extrait 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 coup d'œil à cet extrait du fichier include dans /usr/include/sys/personality.h (référencée comme <sys/personality.h> dans le code source de setarch) :

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

En résumé, vous pouvez, à partir d'un code C, appeler et configurer la personnalité pour qu'elle utilise ADDR_NO_RANDOMIZE, puis exec (tout comme setarch fait).

#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 évident que vous ne pouvez pas désactiver la randomisation des adresses dans le processus dans lequel vous vous trouvez (grin : sauf peut-être le chargement dynamique), donc cela n'affecte que les forks et les execs plus tard. Je crois que les drapeaux de randomisation d'adresses sont hérités par les sous-processus enfants ?

Quoi qu'il en soit, voilà comment vous pouvez désactiver par programme la randomisation des adresses dans le code source C. C'est peut-être la seule solution si vous ne voulez pas obliger un utilisateur à intervenir manuellement et à démarrer avec setarch ou l'une des autres solutions énumérées plus haut.

Avant de vous plaindre de problèmes de sécurité liés à la désactivation de cette fonction, sachez que certaines bibliothèques/outils à mémoire partagée (tels que Mémoire partagée de PickingTools et quelques Bases de données IBM ) doivent être en mesure de désactiver la randomisation des adresses mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X