0x7000 · Domaine
Techniques d'exploitation
Un bug ne devient une vulnérabilité que lorsqu'on le transforme en contrôle du programme. Ce domaine parcourt de bout en bout les techniques classiques qui y parviennent — détourner une adresse de retour sauvegardée, enchaîner du code existant avec le ROP, rappeler la libc, écraser la GOT — sur de petits programmes délibérément vulnérables que vous compilez vous-même, mitigations désactivées, dans un labo jetable. Chaque tutoriel se termine en réactivant la mitigation qui le neutralise, pour que l'étape offensive et la défense qui l'arrête soient côte à côte. C'est ainsi que les défenseurs apprennent contre quoi ils se protègent.
Guides de ce domaine
Tutoriel de labo : écraser une adresse de retour sauvegardée avec pwntools pour rediriger l'exécution, puis voir chaque mitigation casser l'exploit.
Avec NX, le shellcode injecté est mort : on réutilise le code existant. Trouver des gadgets, bâtir une chaîne execve avec pwntools, puis voir CET et CFI la casser.
NX est actif et le binaire est minuscule, mais la libc est mappée et pleine de code utile. Fuitez sa base malgré l'ASLR, puis retournez dans system("/bin/sh").
Un printf(entrée_utilisateur) est une primitive de lecture/écriture complète. Fuitez avec %p, écrasez avec %n via pwntools, puis regardez -Wformat=2 et FORTIFY_SOURCE le neutraliser.
La liaison paresseuse laisse la GOT inscriptible : une écriture arbitraire sur une entrée transforme puts() en system() — jusqu'à ce que Full RELRO la fige.
Les métadonnées du tas sont la primitive d'écriture. Un use-after-free empoisonne le tcache de la glibc pour allouer un chunk à une adresse choisie.
Les exploits modernes sont fuiter-puis-agir. Construisez une lecture hors limites, puis servez-vous-en pour retrouver un canari de pile, la base PIE et la base libc.
Quand les gadgets sont rares, forgez un cadre de signal. Un appel sigreturn restaure tous les registres depuis la pile d'un coup — construisez-en un avec pwntools pour appeler execve.
Pas de gadget pop rdx ? Le code de démarrage du runtime C a une séquence universelle qui charge plusieurs registres et fait un appel contrôlé. Construisez-la avec pwntools.
Quand le débordement dépasse à peine l'adresse de retour, déplacez rsp vers un tampon maîtrisé et exécutez-y la vraie chaîne. Tutoriel pwntools.
Les hooks partis, l'objet FILE devient la cible : un appel stdio passe par un pointeur de vtable inscriptible — corrompez-le et le prochain fwrite tombe.
Sans fuite libc : forgez la relocation que lit l'éditeur de liens dynamique pour lui faire résoudre et appeler system. Et pourquoi Full RELRO y met fin.
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.
Une politique seccomp qui bannit execve retire le shell du jeu ; les attaquants pivotent : ouvrir le flag, le lire, le renvoyer. La chaîne ORW.
Autres domaines
Fondamentaux de la mémoire
Pile, tas, segments ELF et conventions d'appel : le terrain de chaque bug.
Classes de vulnérabilités
Débordements, use-after-free, double free, bugs d'entiers et de chaînes de format, et comment les repérer.
Mitigations d'exploitation
Canaris, NX/DEP, ASLR/PIE, RELRO, FORTIFY_SOURCE, CFI, CET et PAC, et comment les vérifier.
Trouver les bugs
AddressSanitizer, UBSan et fuzzing guidé par la couverture avec libFuzzer et AFL++.
Triage des crashs
Lire signaux, backtraces, rapports de sanitizers et core dumps, et décider quoi corriger en premier.
Développement sécurisé
Langages sûrs pour la mémoire, C++ plus sûr et une stratégie de migration réaliste.
Parcours d'apprentissage
Un parcours légal et progressif, du C et de l'assembleur aux épreuves pwn de CTF et aux métiers de la sécurité.
Exploitation ARM64
Conventions d'appel AArch64, registre de lien, ROP sur ARM, et défenses PAC et BTI.