Aller au contenu principal
own2pwn
pwn/pwn-intro.tsx

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

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 :

FamilleIdéeExemple typique
Control Flow AttackDé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 AttackRé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 :

control-flow-hijack.txt
  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 chemin
Le PWN, c'est dévier la flèche du flow vers du code qu'on contrôle.
Ce qu'on va voir dans la série
À travers plusieurs techniques, on va voir comment on s'y prend pour détourner des programmes exécutables. Et bien sûr, on passera aussi en revue toutes les protections qui ont été inventées pour rendre la vie dure aux pwners (NX, ASLR, canary, RELRO, CFI, ...).