file
5.36 le dit clairement
file
5.36 l’imprime clairement si l’exécutable est PIE ou non. Par exemple, un exécutable PIE s'affiche comme suit:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
et un non-PIE comme:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
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 PIE shared 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 # 55704865
Un résumé rapide du comportement du fichier 5.36 est le suivant:
- si
Elf32_Ehdr.e_type == ET_EXEC
- sinon si
Elf32_Ehdr.e_type == ET_DYN
- si
DT_FLAGS_1
une entrée de section dynamique est présente
- si
DF_1_PIE
est défini dans DT_FLAGS_1
:
- impression
pie executable
- autre
- autre
- si le fichier est exécutable par l'utilisateur, le groupe ou d'autres
- impression
pie executable
- autre
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.