Ce livre traite du problème de la génération automatique d'exploits pour les vulnérabilités des logiciels. Une définition formelle du terme "exploit" sera fournie au chapitre 2 mais, de manière informelle, un exploit est décrit comme une entrée de programme qui entraîne l'exécution d'un code malveillant1. Nous définissons le code malveillant comme une séquence d'octets injectée par un attaquant dans le programme qui porte atteinte à la sécurité du système ciblé. C'est ce que l'on appelle généralement le shellcode. Les exploits de ce type tirent souvent parti d'erreurs de programmation liées à la gestion de la mémoire ou au typage des variables dans les applications développées en C et C++. Ces erreurs peuvent entraîner des débordements de mémoire tampon, dans lesquels une trop grande quantité de données est écrite dans une mémoire tampon, ce qui entraîne la corruption d'emplacements de mémoire non voulus. Un exploit tirera parti de cette corruption pour manipuler des emplacements de mémoire sensibles dans le but de détourner le flux de contrôle de l'application.