J'ai appris récemment (au less sur Fedora et Red Hat Enterprise Linux) que les programmes exécutables compilés en tant qu'exécutables indépendants de la position (PIE) bénéficient d'une protection ASLR (Address Space Randomization) plus forte.
Alors: Comment puis-je tester si un exécutable particulier a été compilé en tant qu'exécutable indépendant de position, sous Linux?
Vous pouvez utiliser le script perl
contenu dans le package de hardening-check
du hardening-check
, disponible dans Fedora et Debian (en tant que hardening-includes
). Lisez cette page wiki Debian pour plus de détails sur les indicateurs de compilation qui sont vérifiés. C'est spécifique à Debian, mais la théorie s'applique également à Red Hat.
Exemple:
$ hardening-check $(which sshd) /usr/sbin/sshd: Position Independent Executable: yes Stack protected: yes Fortify Source functions: yes (some protected functions found) Read-only relocations: yes Immediate binding: yes
J'ai utilisé readelf --relocs
pour tester si la bibliothèque statique ou dynamic est PIC sur x86-64 de la façon suivante:
$ readelf --relocs /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a |\ awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u R_X86_64_32 R_X86_64_32S R_X86_64_64 R_X86_64_DTPOFF32 R_X86_64_GOTPCREL R_X86_64_PC32 R_X86_64_PLT32 R_X86_64_TLSLD R_X86_64_TPOFF32
Nous voyons ici R_X86_64_32
et R_X86_64_32S
. Cela signifie que le code n'est pas indépendant de la position. Quand je reconstruis une bibliothèque avec -fPIC j'obtiens:
$ readelf --relocs libstdc++.a |\ awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u R_X86_64_64 R_X86_64_DTPOFF32 R_X86_64_GOTPCREL R_X86_64_PC32 R_X86_64_PLT32 R_X86_64_TLSGD R_X86_64_TLSLD
Cette méthode peut probablement fonctionner pour les exécutables, mais je ne l'ai pas utilisée de cette façon.
Il suffit d'utiliser le file
sur le binary:
$ file ./pie-off ./pie-off: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0dc3858e9f0334060bfebcbe3e854909191d8bdc, not ssortingpped $ file ./pie-on ./pie-on: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=962235df5bd188e1ec48c151ff61b6435d395f89, not ssortingpped