Je ne connais rien à PIE, veuillez me dire comment créer un exécutable indépendant de la position.
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 qu'il soit plus difficile pour un attaquant de deviner certains états du programme.
Vous pouvez compiler et lier un exécutable PIE de deux manières. Tout d'abord, compilez tout avec -fPIE
et lien avec -pie
. La seconde est de tout compiler avec -fPIC
et lien avec -pie
.
Si vous construisez à la fois un objet partagé et un programme, alors 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 plus de détails, voir Options de génération de code dans le manuel de 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 plante 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.0.
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 signale pas EXE
. EXE
signifie qu'il manque de 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) ?
Je sais que c'est un vieux sujet, mais cette façon de faire peut faire gagner du temps à certaines personnes.
avec un Hex-Editor, trouvez le 17ème octet, changez la valeur 02 en 03, et c'est tout !