Aller au contenu

Un parcours d'apprentissage de l'exploitation via les CTF

Un parcours légal et progressif du C et de l'assembleur aux défis pwn de CTF : quoi apprendre et dans quel ordre, plateformes de pratique, règles de labo.

Publié le 8 min de lecture

La plupart des gens doués pour prévenir les bugs de sûreté mémoire ont appris, à un moment donné, comment ces bugs sont exploités. Comprendre pourquoi un canari de pile se trouve là où il est, ou pourquoi l'ASLR compte moins une fois qu'une adresse fuit, est bien plus facile après avoir observé ces mécanismes à l'œuvre dans un débogueur. Les compétitions de capture du drapeau (CTF) et les wargames fournissent des programmes délibérément vulnérables exactement dans ce but, dans un cadre légal et sûr. Ce guide expose un parcours d'apprentissage progressif et les plateformes conçues pour lui. Il ne contient aucune solution de défi : les travailler soi-même est tout l'intérêt.

D'abord, les règles de base

  • N'attaquez que ce que l'on vous invite à attaquer. Les défis de CTF, les serveurs de wargames et vos propres machines virtuelles sont de bonne guerre. Les systèmes de production, l'infrastructure de votre employeur sans autorisation écrite, et tout le reste ne le sont pas.
  • Respectez les règles des plateformes. Beaucoup de plateformes interdisent de publier des solutions, d'attaquer l'infrastructure elle-même, ou de partager les drapeaux. Suivez-les.
  • Utilisez un labo. Exécutez les binaires de défi dans une machine virtuelle ou un conteneur jetable, pas sur votre machine d'usage quotidien. Traitez chaque fichier de défi comme non fiable.
  • Divulguez de façon responsable. Si la pratique vous mène à un vrai bug dans un vrai logiciel, signalez-le aux mainteneurs via leur politique de sécurité, et laissez-leur le temps de corriger.

Le parcours en un coup d'œil

ÉtapeFocusObjectif avant de passer à la suite
0Le C et la ligne de commandeÉcrire et déboguer de petits programmes C aisément
1Assembleur et ABILire l'assembleur x86-64 d'une fonction simple et prédire son cadre de pile
2Internes des processus LinuxExpliquer la carte mémoire, les segments ELF et l'édition de liens dynamique
3Débogage et rétro-ingénierieParcourir un binaire dans gdb ; retrouver la logique avec Ghidra
4Fondamentaux de la corruption mémoireRésoudre des défis de pile introductifs avec les mitigations désactivées
5MitigationsExpliquer ce que chaque mitigation arrête et ce qu'elle laisse ouvert
6Tas et sujets avancésComprendre le comportement de l'allocateur et les bugs de durée de vie
7Compétences du monde réelFuzzer du vrai code, lire des avis, écrire des correctifs

Étapes 0 à 2 : les fondations

C. Vous ne pouvez pas comprendre la corruption mémoire sans écrire du C qui en contient. Écrivez de petits programmes avec des tableaux, des pointeurs, des structs et malloc, puis cassez-les exprès et regardez-les échouer sous AddressSanitizer. The C Programming Language de Kernighan et Ritchie reste une introduction compacte ; les références C modernes couvrent les normes plus récentes.

Assembleur. Apprenez à lire le x86-64 : registres, mov, lea, push/pop, call/ret, comparaisons et sauts, et la convention d'appel System V. La méthode la plus rapide est de compiler de toutes petites fonctions et de lire la sortie, par exemple avec Compiler Explorer (godbolt.org) ou objdump -d -M intel. Plus tard, répétez l'exercice pour AArch64, qui est désormais partout.

Internes de Linux. Comprenez la mémoire virtuelle, /proc/<pid>/maps, les sections et segments ELF, le chargeur dynamique, la GOT et la PLT. Le guide sur comment un processus organise sa mémoire couvre l'essentiel.

Étape 3 : débogage et rétro-ingénierie

  • gdb est l'outil central. Apprenez les points d'arrêt, le pas à pas, l'examen de la mémoire (x/), les registres, les backtraces et les fichiers core. Les extensions comme GEF et pwndbg ajoutent une vue de contexte des registres, de la pile et du code qui rend cela bien plus rapide.
  • Ghidra, la suite de rétro-ingénierie open source de la NSA, décompile les binaires en pseudo-C lisible. Utilisez-la pour comprendre ce que fait un binaire de défi avant de l'exécuter.
  • checksec, readelf, objdump, strace et ltrace répondent à des questions rapides : quelles mitigations sont actives, quelles fonctions sont importées, quels appels système s'exécutent.

Être capable de répondre à « que fait ce binaire avec mon entrée ? » constitue l'essentiel de la compétence.

Étapes 4 à 6 : plateformes de pratique

Ces plateformes sont conçues pour l'apprentissage et vous invitent explicitement à attaquer leurs défis :

PlateformeCe qu'elle offreBonne pour
pwn.college (Arizona State University)Un cursus structuré et gratuit avec des cours et des centaines de défis, de l'interaction avec les programmes aux erreurs mémoire, aux mitigations et au noyauUn parcours guidé depuis zéro, dans l'ordre
picoCTF (Carnegie Mellon University)Un CTF accueillant pour débutants avec un espace d'entraînement permanent, incluant les catégories exploitation de binaires et rétro-ingénieriePremiers défis, étudiants
Wargames OverTheWireWargames sur SSH de longue haleine ; Bandit enseigne le shell, tandis que Narnia, Behemoth et Utumno se concentrent sur les bugs mémoire classiquesPratique progressive, à son rythme
ROP EmporiumUn ensemble ciblé de défis sur les concepts de réutilisation de code, avec les mitigations comme thème centralComprendre pourquoi CFI et shadow stacks existent
CTFtimeUn calendrier et une archive des compétitions de CTF dans le monde, avec des classements d'équipesTrouver des compétitions en direct et des équipes

Un ordre raisonnable : travaillez les premiers modules de pwn.college ou l'espace d'entraînement d'exploitation de binaires de picoCTF, continuez avec OverTheWire, puis rejoignez des CTF en direct via CTFtime, idéalement avec une équipe. Résoudre la même classe de bug avec et sans chaque mitigation est l'exercice le plus instructif disponible, car il vous montre précisément ce que chaque mitigation coûte à un attaquant. Reliez ce que vous apprenez aux guides sur les flags de durcissement des binaires et l'intégrité du flux de contrôle.

Comment étudier efficacement

  • Prenez des notes par classe de bug, pas par défi : à quoi ressemblait le motif vulnérable, comment il a été détecté, et quelle mitigation comptait.
  • Après avoir résolu, corrigez le binaire. Réécrivez correctement la fonction vulnérable, recompilez avec des flags de durcissement, et confirmez que le problème a disparu. C'est l'étape qui transforme la compétence CTF en compétence d'ingénierie.
  • Ne lisez les write-ups qu'après avoir essayé, et seulement pour des compétitions passées dont les organisateurs l'autorisent.
  • Reconstruisez les défis vous-même. Écrire votre propre petit programme vulnérable et l'exploiter dans votre labo enseigne les mécanismes plus en profondeur que n'importe quel write-up.

Étape 7 : des défis au vrai code

Les binaires de CTF sont petits et délibérément vulnérables. Le vrai logiciel est grand et majoritairement correct. Combler l'écart :

  • Fuzzez du vrai code open source. Écrivez un harnais pour un parseur que vous utilisez, en suivant fuzzing guidé par couverture avec libFuzzer et AFL++. Signalez et aidez à corriger ce que vous trouvez.
  • Lisez les avis et les correctifs. Pour une CVE de sûreté mémoire publiée, lisez le commit de correction et les tests ajoutés avec lui. Demandez-vous quelle mitigation aurait arrêté l'exploitation, et quel outil l'aurait trouvée en premier.
  • Triez les crashs. Pratiquez le flux de travail de lire les rapports de crash sur les crashs que vos fuzzers trouvent.
  • Contribuez des correctifs. Des flags de durcissement absents de la build d'un projet, un harnais pour OSS-Fuzz, ou une vérification de bornes dans un parseur sont des contributions bienvenues qui construisent un historique public.

Où cela mène

RôleComment la connaissance de l'exploitation est utilisée
Ingénieur en sécurité applicative / produitRevoir du code natif, prioriser les découvertes, choisir les mitigations
Chercheur en vulnérabilitésTrouver et divulguer de façon responsable des bugs, évaluer la gravité
Développeur de logiciels sécurisésÉcrire et revoir du C, du C++ et du Rust avec la sûreté mémoire à l'esprit
Intervenant en réponse aux incidents / analyste DFIRReconnaître les artefacts d'exploitation dans les crashs, la mémoire et les logs
Ingénieur en détectionConstruire des détections pour le comportement d'exploitation et les violations de mitigation

Points clés à retenir

  • Apprenez dans l'ordre : C, assembleur, internes des processus, débogage et rétro-ingénierie, puis corruption mémoire et mitigations.
  • Ne pratiquez que sur des plateformes et systèmes qui vous y invitent, et dans un labo jetable.
  • pwn.college, picoCTF, OverTheWire, ROP Emporium et CTFtime couvrent ensemble un parcours complet des premiers pas aux compétitions en direct.
  • Après chaque défi résolu, corrigez et durcissez le code vulnérable : c'est là que la connaissance de l'exploitation devient une compétence défensive.

Guides associés

0x7000 · Techniques d'exploitation

one-gadget : une adresse vers un shell

Parfois vous ne contrôlez qu'un pointeur. Un one-gadget est une seule adresse libc qui appelle execve("/bin/sh") si ses contraintes tiennent.