samedi 8 mars 2014

Le code cave et l'infection PE

A propos de PE:

Le format "Portable Executable" de windows est conçu pour être pratique et permettre d'organiser un fichier exécutable afin de contenir diverses informations pour son lancement et quelques ressources (comme une image ou un autre binaire). L'organisation interne du format est très documentée et le fichier en lui même et ses différentes sections peuvent être vues comme des répertoires dans lesquelles sont rangés plusieurs choses, les premiers octets du fichier sont des headers. L'en-tête du PE contient une en-tête DOS, une en-tête Nt et une en-tête pour les différentes sections. On trouve ensuite les sections en elles-mêmes.

Les structures des en-têtes sont documentées sur le site de Microsoft, et un des header principaux : l'Image Optional Header (qui n'a rien d'optionnel, doc)  contient des champs primordiaux, dont la taille de l'image, l'adresse relative du point d'entrée, l'adresse de la section code, la checksum, etc.
On peut évidemment modifier ces informations en écrivant les bons octets aux bons endroits du fichier.

Code Cave ?

La section code contient le code à proprement parler de l'exécutable sous forme d'opcode, à partir duquel on peut déduire l'ASM. Une partie de la section, à la fin du vrai code est remplie de 0 jusqu'au début de la section suivante, cet espace ne sert normalement qu'à aligner les données, mais le but de l'infection d'un fichier PE par le code-cave est de réquisitionner cet espace, d'y écrire un shellcode totalement arbitraire réalisant diverses opérations. Il faut ensuite rediriger le point d'entrée de l'image (le membre AddressOfEntryPoint de la structure IMAGE_OPTIONAL_HEADER) vers l'adresse de base du shellcode, de cette manière lorsque que l'exécutable sera lancé, le code sera exécuté en premier, il convient alors de terminer le shellcode par un jmp (0xE9) vers l'adresse originale du point d'entrée afin que le programme démarre normalement alors que notre code a été exécuté avant.

Quel intérêt de cette méthode ?

L'infection du PE au moyen d'un code cave a ceci de bien  qu'elle préserve la taille du fichier, elle ne crée aucune section supplémentaire et est à ce titre beaucoup moins détectable qu'une infection rajoutant une section à la fin du PE en lui donnant un flag exécutable, ou en redirigeant le point d'entrée vers des endroits suspects (typiquement avant la première section). Il existe d'autres techniques plus sophistiquées comme la fragmentation du shellcode et l'utilisation de plusieurs caves, qui necéssite un programme d'infection plus compliqué et un "loader" injecté dans le code pour rassembler les pièces du shellcode...

(P.S : on parle ici de code-cave dans le cas d'une infection PE, le terme code-cave est aussi utilisé dans le même esprit pour une injection de code dans un thread, où la technique est la même et consiste à injecter le shellcode dans un endroit libre à distance.)

Aucun commentaire:

Enregistrer un commentaire