Le pwn, c'est quoi
exactement ?
PWN, ou Perfectly Owned : l'art de prendre le contrôle d'un programme exécutable. On pose la définition à notre sauce et on présente les deux grandes familles d'attaques que la série va décortiquer : Control Flow Attacks et Code Reuse Attacks.
Maxime Jérôme··4 min de lecture
Prérequis
- Comprendre les fichiers ELF (voir Segmentation Mémoire)
- Maniement de GDB
Hello ! o/
Pour ouvrir cette série, on va devoir poser une définition de ce qu'est le pwn... à notre sauce ! Parce qu'on utilise ce mot un peu partout et n'importe comment, et nous on l'a appris sous deux angles complémentaires.
D'abord l'origine. PWN vient de Perfectly Owned : quand un attaquant a pris le contrôle complet d'une machine, on dit qu'elle est pwned. À partir de là, dans le contexte de l'exploitation binaire, on s'est mis à utiliser une définition plus opérationnelle :
PWN = contrôler le flow d'un programme exécutable.
Du coup on va s'amuser à comprendre les 2 manières de péter du binaire :
| Famille | Idée | Exemple typique |
|---|---|---|
| Control Flow Attack | Détourner le flow vers une zone non prévue par l'exécution normale. Autrement dit : prendre le contrôle de EIP/RIP. | Stack overflow → on écrase l'adresse de retour |
| Code Reuse Attack | Réutiliser des morceaux de code déjà chargés en mémoire pour faire ce qu'on veut, en s'appuyant sur un Control Flow Attack pour amorcer. | ROP, ret2libc |
Le PWN en une image
Voilà ce que ça donne, schématiquement, quand on détourne le flow d'un binaire ELF en mémoire :
Programme ELF chargé en mémoire
┌────────────────────────────────────────┐
│ .text │ .data │ [heap] [stack]│
│ │ │
│ │ flow d'exécution normal │
│ ▼ │
│ call printf │
│ call main │
│ ret ────► retourne au caller │
│ │
│ ╳ on dévie le flow ╳ │
│ ret ──┐ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ gadget ROP / shellcode / │ │
│ │ libc one-gadget / ... │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────────┘
▲
PWN = on contrôle ce cheminCe qu'on va voir dans la série
Article suivant
Comment on tombe sur un bug exploitable