Teste si le binary Linux est compilé en tant que code indépendant de la position

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