2.6 KiB

PIE

{{#include ../../../banners/hacktricks-training.md}}

Informations de base

Un binaire compilé en tant que PIE, ou Position Independent Executable, signifie que le programme peut se charger à différents emplacements mémoire chaque fois qu'il est exécuté, empêchant les adresses codées en dur.

Le truc pour exploiter ces binaires réside dans l'exploitation des adresses relatives—les décalages entre les parties du programme restent les mêmes même si les emplacements absolus changent. Pour contourner PIE, vous devez seulement divulguer une adresse, généralement depuis la pile en utilisant des vulnérabilités comme les attaques par chaîne de format. Une fois que vous avez une adresse, vous pouvez calculer d'autres par leurs décalages fixes.

Un indice utile pour exploiter les binaires PIE est que leur adresse de base se termine généralement par 000 en raison des pages mémoire étant les unités de randomisation, de taille 0x1000 octets. Cet alignement peut être un vérification critique si une exploitation ne fonctionne pas comme prévu, indiquant si la bonne adresse de base a été identifiée.
Ou vous pouvez utiliser cela pour votre exploitation, si vous divulguez qu'une adresse est située à 0x649e1024, vous savez que l'adresse de base est 0x649e1000 et à partir de là, vous pouvez simplement calculer les décalages des fonctions et des emplacements.

Contournements

Pour contourner PIE, il est nécessaire de divulguer une adresse du binaire chargé, il existe plusieurs options pour cela :

  • ASLR désactivé : Si ASLR est désactivé, un binaire compilé avec PIE est toujours chargé à la même adresse, donc PIE va être inutile car les adresses des objets seront toujours au même endroit.
  • Être donné la fuite (commun dans les défis CTF faciles, vérifiez cet exemple)
  • Brute-forcer les valeurs EBP et EIP dans la pile jusqu'à ce que vous divulguiez les bonnes :

{{#ref}} bypassing-canary-and-pie.md {{#endref}}

  • Utiliser une vulnérabilité de lecture arbitraire telle que format string pour divulguer une adresse du binaire (par exemple, depuis la pile, comme dans la technique précédente) pour obtenir la base du binaire et utiliser des décalages à partir de là. Trouvez un exemple ici.

Références

{{#include ../../../banners/hacktricks-training.md}}