web-dev-qa-db-fra.com

Positionner les exécutables indépendants et Android

J'ai écrit un code source .c (dans Eclipse) qui utilise la bibliothèque libcap pour obtenir des informations liées au trafic réseau. Maintenant, j'ai créé un binaire exécutable en utilisant ndk-build dans Eclipse. J'ai poussé le binaire créé dans le dossier libs/armeabi vers le dossier/data/local/de mon Android (nexus rooté 5, Lollipop) et j'ai essayé d'exécuter le binaire. Mais Android lance cette erreur

Erreur: seuls les exécutables indépendants de la position (PIE) sont pris en charge

Je ne sais rien de PIE, dites-moi comment créer un exécutable indépendant de poste.

16
Adi Tiwari

Je ne sais rien de PIE, dites-moi comment créer un exécutable indépendant.

Position Independent Executable ou PIE permet de déplacer un programme, tout comme un objet partagé. À chaque exécution du programme, le programme peut être chargé à différentes adresses pour rendre plus difficile pour un attaquant de deviner un certain état du programme.

Vous pouvez compiler et lier un exécutable PIE de deux manières. Tout d'abord, compilez tout avec -fPIE et un lien avec -pie. La seconde consiste à tout compiler avec -fPIC et un lien avec -pie.

Si vous créez à la fois un objet partagé et un programme, compilez tout avec -fPIC. Liez l'objet partagé avec -shared, et liez le programme avec -pie.

Vous ne pouvez pas le faire dans l'autre sens. Autrement dit, vous ne pouvez pas tout compiler avec -fPIE et construire à la fois un objet partagé et un programme. Pour les détails, voir Options de génération de code dans le manuel GCC.


Une chose à surveiller sur Android: la construction avec PIE avant 4.1 entraînera une erreur de segmentation dans /system/bin/linker. PIE a été ajouté à Android 4.1, et il bloque les versions inférieures.

Quelqu'un m'a dit de fournir un lien/chargeur personnalisé pour éviter le problème, mais je ne trouve pas la référence pour le moment.

Voir également Améliorations de la sécurité dans Android 1.5 à 4.1 .


Erreur: seuls les exécutables indépendants de la position (PIE) sont pris en charge

Oui, c'est une fonction Lollipop. Voir Améliorations de la sécurité dans Android 5. .


Vous pouvez vérifier si un programme est construit avec PIE en utilisant readelf:

$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)

La partie importante est readelf rapporte DYN, et ne rapporte pas EXE. EXE signifie qu'il manque PIE, et cela devrait déclencher un défaut lié à la sécurité.


En relation, voir Est-ce que PIE (exécutable indépendant de la position) pour les principaux exécutables est pris en charge dans Android 4.0 (ICS)?

18
jww

je sais que c'est un vieux sujet, mais cette façon hacky peut faire gagner du temps à certaines personnes
avec un éditeur hexadécimal, trouvez le 17e octet, changez la valeur 02 en 03, et c'est tout!

4
Koorosh Ghorbani