> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/pwn/protections/pie.md).

# PIE

Position Independent Executable

**PIE (Position Independent Executable)** change l'emplacement du binaire à chaque exécution. L'adresse de base de l'exécutable et de ses fonctions sont donc modifiées.  Elle modifie aussi l'adresse des gadgets pour se protéger d'une attaque [ROP (Return Oriented Programming)](/cyber/pwn/stack/rop-return-oriented-programming.md).

Elle peut être utilisée en plus de [ASLR](/cyber/pwn/protections/aslr.md).

## Faiblesse

Les adresses absolues sont modifiées mais **les offset restent les mêmes**: les distances entre les différentes parties du binaire ne changent pas. Si on connait l'offset de `main` par rapport à la base du binaire et qu'on trouve l'adresse de `main` on retrouve l'adresse de base. A partir de là on peut tout récupérer avec les offsets.

Par exemple si on sait que `main` est situé à `0x207` de la base et qu'on trouve que son adresse est `0xbfffcea0` on sait que l'adresse de base est `0xbfffcea0 - 0x207 = 0xbfffcc99`.

## Linux

**Activer:**

```
gcc program.c -o program -pie
```

**Désactiver:**

```
gcc program.c -o program -no-pie
```

{% hint style="warning" %}
L'ASLR doit être activée.
{% endhint %}
