2016-08-07 30 views
1

Ich habe zu arbeiten, wenn ASLR wie folgt aktiviert ist und ich denke, es ist:Warum scheint ASLR nicht

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

versuchte ich es mit dem folgenden Programm testen:

test.c :

Ich erwartete, wenn ASLR aktiv ist, zu einer anderen Adresse für jeden Lauf, richtig? Aber ich habe jedes Mal dasselbe bekommen. Ich habe sowohl für 64-Bit- als auch für 32-Bit-Programme getestet. Ich bin mit einem 64-Bit-Arch Linux-System dies testen:

[[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 

Wie Sie sehen können, die Adresse die gleiche für jeden Lauf ist. Bedeutet das nicht, dass ASLR ausgeschaltet ist?

+0

Versuchen Sie, Adresse einer Variablen, nicht eine nicht statische Funktion – Elazar

+0

BTW übergeben ein nicht 'void *' zu einem '% p' ​​Argument in 'printf' ist undefiniertes Verhalten – Elazar

+0

@Elazar Warum? Eine Funktion im '.text' Abschnitt sollte von ASLR betroffen sein, nein? Ist ASLR nicht auf seiner grundlegendsten Ebene gedacht - Randomisierung des ausführbaren Abschnitts? – baruch

Antwort

6

Ihre ausführbare Datei muss positionsunabhängig sein, um dies zu ermöglichen.

gcc -pie -fPIE -o test test.c 

Versuchen Sie es auf diese Weise, die Adresse sollte sich bei jedem Lauf sichtbar ändern.

Nicht-PI-ausführbare Dateien werden unter einer festen, explizit nicht zufälligen Adresse geladen, die in ihrem ELF-Header gespeichert ist. Diese Annahme ermöglicht es dem Compiler und Linker, absolute Adressen in die Ausgabe zu schreiben, wodurch sie auf einigen Zielen kleiner und schneller werden.

Das Laden von Nicht-PI-Executables an jeder anderen Adresse macht alle diese absoluten Referenzen ungültig, was bestenfalls zu SIGSEGV führt und im schlimmsten Fall zu zufälligem Code führt. Die Adresse main kann nicht sicher randomisiert werden, da der Compiler davon ausgehen durfte, dass dies nicht der Fall sein wird. Selbst wenn ASLR aktiviert ist, wird dies nie gemacht.

Randomisierung zu ermöglichen, muss der Compiler positionsunabhängigen Code (-fPIE) und die resultierende ausführbare Datei muss markiert werden als positionsunabhängige (-pie), so dass der Kern an jeder Adresse zu laden, sicher würde wissen generieren wird gesagt, es ist .

Welche Optionen sind notwendig, dass eine Menge ist abhängig von Konfiguration Werkzeugkette zu erreichen, -fpie, -fPIE, -fpic, -fPIC, einige können PI-Code standardmäßig erzeugen. Die sichere Wette ist, mit -fPIE zu kompilieren und mit -pie -fPIE zu verbinden.

+0

Danke.Ich habe mir etwas Zeit genommen, um zu recherchieren - pie und -fpie, bevor ich akzeptiere, aber es würde wahrscheinlich anderen helfen, wenn Sie kurz erklären, was diese tun oder warum das mit ASLR zu tun hat. – baruch

+0

Der Post wurde aktualisiert, hoffentlich ist er jetzt eigenständig genug, um ohne viel Googeln lesbar zu sein. – arsv