Ich habe kürzlich erfahren, dass (zumindest unter Fedora und Red Hat Enterprise Linux) ausführbare Programme, die als Position Independent Executables (PIE) kompiliert wurden, einen stärkeren Schutz durch Adressraum-Randomisierung (ASLR) erhalten.
Also: Wie teste ich, ob eine bestimmte ausführbare Datei unter Linux als positionsunabhängige ausführbare Datei kompiliert wurde?
-pie -fpie
speziellen Compiler-Flags übergeben, um ein Programm als PIE zu kompilieren. Dieser Link enthielt jedoch noch weitere interessante Informationen - danke!Antworten:
Sie können das
perl
imhardening-check
Paket enthaltene Skript verwenden , das in Fedora und Debian (alshardening-includes
) verfügbar ist . Lesen Sie diese Debian-Wiki-Seite, um zu erfahren, welche Compile-Flags überprüft werden. Es ist Debian-spezifisch, aber die Theorie gilt auch für Red Hat.Beispiel:
quelle
sudo apt-get install hardening-includes
und dann ist dashardening-check
ausführbare Perl-Skript auf dem usualPATH
(/usr/bin/hardening-check
) verfügbar ; nur nit: Schlagen Sie die entfernen ,./
aus der Antwort ;-)devscripts
.Ich habe
readelf --relocs
auf folgende Weise getestet, ob es sich bei der statischen oder dynamischen Bibliothek um PIC auf x86-64 handelt:Wir sehen hier
R_X86_64_32
undR_X86_64_32S
. Dies bedeutet, dass der Code nicht positionsunabhängig ist. Wenn ich eine Bibliothek mit -fPIC neu aufbaue, erhalte ich:Diese Methode funktioniert möglicherweise für ausführbare Dateien, aber ich habe sie nicht so verwendet.
quelle
-fPIE -no-pie
, wäre es immer an der gleichen Adresse geladen werden , obwohl es könnte als PIE ausführbaren verknüpft wurde. Verwendenfile a.out
und suchen Sie nachELF executable
(Nicht-PIE) vs. ELF Shared Object (PIE): 32-Bit-Absolutadressen sind unter x86-64 Linux nicht mehr zulässig?Verwenden Sie einfach
file
auf der Binärdatei:Beachten Sie den anderen Typ, der nach den LSB-Informationen gedruckt wird.
quelle
executable
undshared object
. Ich gehe davon aus, dass freigegebene Objekte verlagerbar sein müssen, daher wurden sie meines Erachtens mit PIE kompiliert.gcc -fPIE -pie
Informationen zu gcc-Optionen, die PIE steuern, sind in vielen Distributionen standardmäßig enthalten.file
nun tatsächlich TORTE anhand derDT_1_PIE
Flagge von erkenntDT_FLAGS_1
undpie executable
stattdessen deutlich sagtshared object
.file
5.36 sagt es deutlichfile
5.36 gibt tatsächlich deutlich aus, ob es sich bei der ausführbaren Datei um PIE handelt oder nicht. Beispielsweise zeigt eine ausführbare PIE-Datei Folgendes:und eine Nicht-TORTE als:
Die Funktion wurde in 5.33 eingeführt, aber es wurde nur eine einfache
chmod +x
Überprüfung durchgeführt. Davor wurde es nurshared object
für PIE gedruckt .In 5.34 sollte damit begonnen werden, die spezialisierteren
DF_1_PIE
ELF-Metadaten zu überprüfen. Aufgrund eines Fehlers in der Implementierung wurden jedoch tatsächlich Fehler aufgetreten, und die ausführbaren Dateien von GCC PIE wurden als angezeigtshared objects
.Ich habe den
file
Quellcode einschließlich des Fehlers und genau die Bytes des ELF-Formats interpretiert , die es in qualvollen Details überprüft: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object statt einer ausführbaren Binärdatei gemäß / 55704865 # 55704865Eine kurze Zusammenfassung des Verhaltens von Datei 5.36 lautet:
Elf32_Ehdr.e_type == ET_EXEC
executable
Elf32_Ehdr.e_type == ET_DYN
DT_FLAGS_1
dynamischer Abschnittseintrag vorhanden istDF_1_PIE
eingestellt ist inDT_FLAGS_1
:pie executable
shared object
pie executable
shared object
GDB führt die ausführbare Datei zweimal aus und zeigt ASLR an
Eine sehr direkte Sache, die Sie tun können, ist, die ausführbare Datei zweimal über GDB auszuführen und zu prüfen, ob sich die Adresse aufgrund von ASLR zwischen den Ausführungen ändert.
Wie das geht, habe ich ausführlich erklärt unter: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Dies ist zwar nicht unbedingt die praktischste Lösung und nicht möglich, wenn Sie der ausführbaren Datei nicht vertrauen, aber es macht Spaß und führt die ultimative Überprüfung durch, die uns wirklich am Herzen liegt nicht.
quelle
setarch -R
man7.org/linux/man-pages/man8/setarch.8.html deaktiviert werden. "-R, --addr-no-randomize
Deaktiviert die Randomisierung des virtuellen Adressraums. Wird aktiviertADDR_NO_RANDOMIZE
." man7.org/linux/man-pages/man2/personality.2.html "ADDR_NO_RANDOMIZE
(seit Linux 2.6.12) Deaktivieren Sie bei gesetztem Flag die Adressraum-Layout-Randomisierung."Es gibt ein Bash-Skript checksec.sh auf Github , um die Eigenschaften der ausführbaren Dateien zu überprüfen (einschließlich RELRO, Stack Canary, NX-Bit, PIE, RPATH, RUNPATH, Fortify Source).
Führen Sie
checksec
mit-f
(Input - Datei) Argumente:quelle