La lecture du billet de l'ISC de ce matin rappelle une astuce que nous avions récemment rencontrée lors de l'analyse d'un document PDF malveillant.

Celui-ci explique une méthode un peu particulière de shellcode dans un document PDF exploitant la dernière vulnérabilité 0-day dans Adobe Reader (Réf. Lexsi 12676). En effet, celui-ci est d'une taille très réduite (38 octets uniquement), et va effectuer une recherche à travers les pages mémoires du processus, jusqu'à trouver un certain motif, puis sauter à l'adresse de celui-ci, pour continuer l'exécution. Le-dit motif se trouve dans un objet de type flux compressé du document PDF malveillant. Le second shellcode a pour effet de décoder puis lancer deux exécutables, eux aussi contenus dans le PDF. Le premier va provoquer l'ouverture d'un document PDF non malveillant, tandis que le second est un malware tentant de se connecter à un canal de contrôle.

La méthode que nous avions rencontrée est sensiblement identique. La vulnérabilité exploitée est alors un débordement de tampon dans le tas dans la gestion des fichiers U3D (Réf. Lexsi 12415), et la technique du heap-spraying est employée, afin de mettre en forme le tas pour y rediriger l'exécution. Un coup d'oeil rapide au document nous montre que le shellcode injecté dans le tas est le suivant :

Une fois celui-ci chargé dans le débogueur, nous nous trouvons face à un début plutôt classique (pour de plus amples détails, voir cette précédente analyse de shellcode) :

  • une boucle se charge de déchiffrer la suite du shellcode par un XOR avec la valeur "0xF9"

  • ensuite, celui-ci va rechercher les adresses de plusieurs fonctions de l'API Windows

L'étape suivante est plus intéressante : le shellcode va effectuer un brute-force des descripteurs de fichiers ouverts, jusqu'à en trouver un dont l'entête de fichier correspond à celle d'un document PDF, puis vérifier la présence de certains motifs à certains offsets.

Ceci va lui permettre de disposer d'un handle vers le document PDF malveillant, et une fois celui-ci obtenu, d'extraire puis de décoder un second shellcode en le recherchant à un offset bien précis. La suite est très similaire à l'analyse de l'ISC : le second shellcode va ouvrir un document PDF légitime et exécuter un binaire de type downloader inclus dans le PDF malveillant.

Cette méthode permet de rechercher un deuxième étage de shellcode de façon plus fiable qu'un parcours complet des pages mémoires du processus, dans lesquelles il existe un risque de trouver une suite d'octet correspondant au motif recherché sans pour autant que ce soit le début du shellcode, ou encore de provoquer une erreur en accédant à de la mémoire non mappée.