2016-08-07 4 views
1

J'ai vérifié si ASLR est activé comme suit et je pense qu'il est:Pourquoi ne ASLR semble pas fonctionner

[[email protected] test]$ cat /proc/sys/kernel/randomize_va_space 
2 

Je l'ai essayé de tester le programme suivant:

test.c :

#include <stdio.h> 
int main(void) 
{ 
    printf("%p\n", main); 
    return 1; 
} 

Je m'attendais, si ASLR est actif, à une adresse différente pour chaque exécution, non? Mais j'ai toujours la même chose. J'ai testé les deux pour les exécutables 64bit et 32bit. J'utilise un système 64bit Arch Linux pour tester ceci:

[[email protected] test]$ gcc test.c -o test 
[[email protected] test]$ ./test 
0x4004c6 
[[email protected] test]$ ./test 
0x4004c6 
[[email protected] test]$ ./test 
0x4004c6 
[[email protected] test]$ ./test 
0x4004c6 
[[email protected] test]$ gcc -m32 test.c -o test 
[[email protected] test]$ ./test 
0x80483eb 
[[email protected] test]$ ./test 
0x80483eb 
[[email protected] test]$ ./test 
0x80483eb 
[[email protected] test]$ ./test 
0x80483eb 

Comme vous pouvez le voir, l'adresse est la même pour chaque course. Cela ne signifie-t-il pas que ASLR est éteint?

+0

Essayez de prendre l'adresse d'une variable, pas une fonction non statique – Elazar

+0

BTW passant un non 'void *' à un argument '% p' ​​dans 'printf' est un comportement indéfini – Elazar

+0

@Elazar Pourquoi? Une fonction dans la section '.text' devrait être affectée par ASLR, non? N'est-ce pas ce à quoi ASLR est destiné au niveau le plus basique - randomiser la section exécutable? – baruch

Répondre

6

Votre fichier exécutable doit être indépendant de la position pour permettre cela. Essayez de l'exécuter de cette façon, l'adresse devrait changer visiblement à chaque exécution.

Les exécutables non-PI sont destinés à être chargés à une adresse fixe non explicitement stockée dans leur en-tête ELF. Cette hypothèse permet au compilateur et à l'éditeur de liens de coder en dur les adresses absolues dans la sortie, ce qui le rend plus petit et plus rapide sur certaines cibles.

Le chargement d'exécutables non-PI à toute autre adresse invalide toutes ces références absolues, ce qui entraîne au mieux SIGSEGV et un code aléatoire au pire. L'adresse de main ne peut pas être randomisée en toute sécurité car le compilateur a été autorisé à supposer que ce ne sera pas le cas, donc ce n'est jamais fait même si ASLR est activé.

Pour permettre randomisation, le compilateur doit être dit pour générer du code indépendant de la position (-fPIE), et l'exécutable résultant doit être marqué comme position indépendante (-pie) pour que le noyau sache qu'il est sûr de charger à toute adresse .

Quelles options sont nécessaires pour atteindre cela dépend beaucoup de la configuration toolchain, -fpie, -fPIE, -fpic, -fPIC, certains peuvent générer du code PI par défaut. Le pari sûr est de compiler avec -fPIE et de lier avec -pie -fPIE.

+0

Merci.J'ai pris le temps de faire des recherches -pie et -pie avant d'accepter, mais cela aiderait probablement les autres si vous expliquiez brièvement ce que cela fait ou pourquoi cela a à voir avec ASLR. – baruch

+0

Mis à jour le poste, j'espère qu'il est assez autonome maintenant pour être lisible sans trop de googling. – arsv