SEH Overwrite
hackingDéfinition
Le SEH Overwrite (Structured Exception Handler Overwrite) est une technique d'exploitation Windows qui cible les gestionnaires d'exceptions structurées (SEH) pour obtenir une exécution de code lors d'un buffer overflow. Sur Windows, quand une exception se produit (comme un access violation causé par un buffer overflow), le système exécute les gestionnaires d'exceptions chainés dans une liste SEH, offrant une alternative à l'écrasement direct de l'adresse de retour.
La structure SEH (EXCEPTION_REGISTRATION_RECORD) stockée sur la pile contient deux éléments : un pointeur vers le gestionnaire d'exception suivant dans la chaîne (Next), et un pointeur vers la fonction gestionnaire actuelle (Handler). Un buffer overflow peut écraser ces deux valeurs. Si une exception est déclenchée après l'overflow (par exemple en accédant à une mémoire invalide), Windows appelle le gestionnaire d'exception ecrasé.
La protection SafeSEH (compilée avec /SAFESEH sur MSVC) maintient une liste des gestionnaires valides dans la section du binaire et vérifie que le pointeur Handler écrasé figure dans cette liste. SEHOP (SEH Overwrite Protection, activé depuis Windows Vista) valide la chaîne SEH complète avant d'appeler le premier gestionnaire en vérifiant que la chaîne se termine par le gestionnaire final légitime de ntdll.dll, détectant toute corruption.
Sans ces protections, la technique classique utilise un 'jump pair' : trouver dans un module non protégé par SafeSEH une séquence pop reg; pop reg; ret (pour sauter au-delà du pointeur Next et Handler et atterrir dans le payload). Des outils comme mona.py dans Immunity Debugger automatisent la recherche de ces gadgets pop/pop/ret dans les modules non-SafeSEH.
Les exploitations SEH sont particulièrement intéressantes car elles permettent d'exploiter des overflow qui ne contrôlent pas directement l'adresse de retour (overflow dans des fonctions imbriquées, ou overflow partiel ne dépassant pas jusqu'à la return address), mais qui atteignent les enregistrements SEH sur la pile.
Fonctionnement
Layout de la pile lors d'un SEH exploit : [buffer overflow payload] [NSEH: JMP short +8 (0xEB 0x06)] [SEH: adresse du gadget pop/pop/ret] [shellcode]. Quand l'exception est déclenchée, Windows appelle le gestionnaire SEH (pop/pop/ret) via ESP+8. pop/pop dépile les deux paramètres de l'exception handler (pointeurs vers EXCEPTION_RECORD et CONTEXT), ret dépile l'adresse NSEH et y saute. Le JMP short +8 saute dans le shellcode. Ce schéma évite d'écraser la return address directement.
Exploitation offensive
La technique SEH overwrite est enseignée dans les formations de développement d'exploits (OSED, EXP-301) comme base de la compréhension des exploitations Windows. Elle s'applique sur des applications compilées sans SafeSEH ni SEHOP. Dans des CTF et sur des logiciels plus anciens, elle reste une technique valide et pédagogique.
Détection et mitigation
La compilation avec /SAFESEH (Visual Studio) et l'activation de SEHOP (registry: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel → DisableExceptionChainValidation=0) sont les mitigations primaires. Stack canary détecte l'overflow avant l'exception si la chaîne SEH est overwritée après le canari. Les binaires modernes compilés avec toutes les protections Windows rendent les SEH overwrites inefficaces.
Ce terme vous interpelle ?
Nos experts interviennent sur toutes les thématiques de ce glossaire — pentest, conformité NIS 2 / ISO 27001, forensics, sécurité IA. Réponse sous 24h, devis gratuit et sans engagement.