J'ai récemment appris que (du moins sur Fedora et Red Hat Enterprise Linux), les programmes exécutables compilés en tant qu'exécutables indépendants de la position (PIE) bénéficient d'une protection renforcée de la randomisation de l'espace adresse (ASLR).
Alors: comment puis-je tester si un exécutable particulier a été compilé en tant qu’exécutable indépendant du poste sous Linux?
-pie -fpie
indicateurs spéciaux du compilateur pour compiler un programme en tant que PIE. Ce lien contenait d'autres informations intéressantes - merci!Réponses:
Vous pouvez utiliser le
perl
script contenu dans lehardening-check
paquet, disponible dans Fedora et Debian (en tant quehardening-includes
). Lisez cette page wiki Debian pour plus de détails sur les drapeaux de compilation à vérifier. C'est spécifique à Debian, mais la théorie s'applique également à Red Hat.Exemple:
la source
sudo apt-get install hardening-includes
et ensuite lehardening-check
script exécutable perl est disponible avec la valeur habituellePATH
(/usr/bin/hardening-check
); juste un nit: suggère de retirer le./
de la réponse ;-)devscripts
.J'avais l'habitude
readelf --relocs
de tester si la bibliothèque statique ou dynamique est PIC sur x86-64 de la manière suivante:Nous voyons ici
R_X86_64_32
etR_X86_64_32S
. Cela signifie que le code n'est pas indépendant de la position. Lorsque je reconstruis une bibliothèque avec -fPIC, je reçois:Cette méthode peut probablement fonctionner pour les exécutables, mais je ne l'ai pas utilisée de cette façon.
la source
-fPIE -no-pie
, il sera toujours chargé à la même adresse même s'il aurait pu être lié en tant qu'exécutable PIE. Utiliserfile a.out
et rechercherELF executable
un objet partagé (non-PIE) par rapport à un objet partagé ELF (PIE): les adresses absolues 32 bits ne sont plus autorisées dans x86-64 Linux?Utilisez simplement
file
sur le binaire:Notez le type différent imprimé après les informations LSB.
la source
executable
etshared object
. Je suppose que les objets partagés doivent pouvoir être déplacés, ce qui, à mon avis, a été compilé avec PIE.gcc -fPIE -pie
s’agit maintenant du comportement par défaut de nombreuses distributions.file
5.36 peut maintenant reconnaître PIE-ness sur la base duDT_1_PIE
drapeau deDT_FLAGS_1
, et dit clairementpie executable
au lieu deshared object
.file
5.36 le dit clairementfile
5.36 l’imprime clairement si l’exécutable est PIE ou non. Par exemple, un exécutable PIE s'affiche comme suit:et un non-PIE comme:
La fonctionnalité a été introduite dans la version 5.33 mais elle n’a fait qu’une simple
chmod +x
vérification. Avant cela, il venait juste d’être impriméshared object
pour PIE.En 5.34, il était censé commencer à vérifier les
DF_1_PIE
métadonnées ELF plus spécialisées , mais en raison d’un bogue dans l’implémentation, il a en réalité volé en éclats et a montré les exécutables de GCC PIEshared objects
.J'ai interprété
file
le code source, y compris le bogue, et exactement quels octets du format ELF il vérifie avec des détails insoutenables à l' adresse : https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object au lieu d'un exécutable binaire selon / 55704865 # 55704865Un résumé rapide du comportement du fichier 5.36 est le suivant:
Elf32_Ehdr.e_type == ET_EXEC
executable
Elf32_Ehdr.e_type == ET_DYN
DT_FLAGS_1
une entrée de section dynamique est présenteDF_1_PIE
est défini dansDT_FLAGS_1
:pie executable
shared object
pie executable
shared object
GDB exécuter le fichier exécutable deux fois et voir ASLR
Une chose très directe que vous pouvez faire est d'exécuter l'exécutable deux fois via GDB et de voir si l'adresse change d'une exécution à l'autre en raison de ASLR.
J'ai expliqué comment procéder en détail à l' adresse suivante : https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Bien que ce ne soit pas nécessairement la solution la plus pratique et impossible si vous ne faites pas confiance à l’exécutable, c’est amusant et cela vérifie en dernier ressort que nous nous soucions vraiment de savoir si le chargeur dynamique du noyau / de Linux modifie l’emplacement de l’exécutable ou si ne pas.
la source
setarch -R
man7.org/linux/man-pages/man8/setarch.8.html "-R, --addr-no-randomize
Désactive la randomisation de l'espace d'adressage virtuel. S'activeADDR_NO_RANDOMIZE
." man7.org/linux/man-pages/man2/personality.2.html "ADDR_NO_RANDOMIZE
(depuis Linux 2.6.12) Lorsque cet indicateur est défini, désactivez la randomisation de la structure d'adresse-espace-espace."Il existe un script bash checksec.sh sur Github pour vérifier les propriétés d’atténuation des exécutables (notamment RELRO, Stary Canary, bit NX, PIE, RPATH, RUNPATH, Fortify Source).
Exécuter
checksec
avec-f
des arguments (entrée de fichier):la source