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.