DarKPhoeniX' homeland

Aller au contenu | Aller au menu | Aller à la recherche

mercredi, juillet 23 2008

Syscalls story

J'ai trouvé un vieux bout de code écrit en C++ qui dormait sur mon disque.

C'est juste un petit programme que j'avais écrit il y a longtemps, et qui permet d'exporter la table des indices des appels système dans une en-tête C (.h). Ca peut servir dans les cas où il faut faire quelques bidouilles sur la SSDT d'un système, ou des trucs pas très clairs dans ce genre là :)

Il suffit de lancer l'éxecutable, et ça génère le .h en sortie :

ntsyscalls.PNG

J'y avais inclus les résultats pour un 2000 SP4, un XP SP2, un 2003 SP1 et un Vista RC1. Grosso modo, on peut constater l'inflation du nombre de syscalls au fil des nouvelles versions de Windows. La version de Vista que j'utilisais mettait à disposition 400 appels système, contre 248 pour le 2000 SP4.

De 2000 à XP, on peut y voir la disparition des appels suivants :

  • ZwCreateChannel
  • ZwGetTickCount
  • ZwListenChannel
  • ZwOpenChannel
  • ZwReplyWaitSendChannel
  • ZwSendWaitReplyChannel
  • ZwSetContextChannel

En regardant le code de GetTickCount dans kernel32.dll, on peut trouver à la place, à partir de XP, un mystérieux (si quelqu'un peut m'expliquer, ça m'intéresse) :

MOV EDX,7FFE0000
MOV EAX,DWORD PTR DS:[EDX]
MUL DWORD PTR DS:[EDX+4]
SHRD EAX,EDX,18
RETN

En échange de cela, XP a introduit une quarantaine de nouveaux appels, 2003 en a apporté une douzaine, et Vista plus d'une centaine... Le tout portant la somme à plus ou moins 400 appels pour Vista.

A titre de comparaison débile, un noyau Linux 2.6 supporte actuellement environ 330 appels système sur x86.

Parmi les nouveaux appels de Vista, on peut remarquer :

  • ZwGetNextProcess
  • ZwGetNextThread

Qui permettent certainement de lister les processus et les threads du système.

  • ZwCreateThreadEx

Qui doit probablement aussi être utilisée pour créer un thread dans un autre processus. Si tel est le cas (je n'ai pas de Vista sous la main pour vérifier), ça permettrait aux antivirus de hooker directement les appels à CreateRemoteThread.

Le reste des nouveaux appels possèdent des noms assez nébuleux ou excentriques, et il ne me semble pas qu'il existe d'analyse en profondeur de leur fonctionnement qui en soit faite encore aujourd'hui.

Un tableau résumé des appels pour chaque version de Windows peut-être consulté sur le site du projet Metasploit.

samedi, avril 26 2008

UnKK - Unpacker pour kkrunchy

kkrunchy est un packer particulièrement prisé par les groupes de demomaking.

Il a été codé par un membre du célèbre groupe de demomakers germanique Farbrausch, ryg, et il est régulièrement utilisé par de gros groupes comme Fairlight, Conspiracy, Equinox ou bien entendu Farbrausch.

Il possède la particularité de posséder un très grand facteur de compression, au détriment d’une vitesse de décompression très lente (plusieurs Mo par seconde pour la version alpha, et plusieurs secondes par Mo dans sa version alpha2...).

Il n’est pour cette raison pratiquement jamais utilisé en dehors du contexte demoscenique, son intérêt résidant principalement dans la conception de démos 64Ko.

A titre de comparaison, j’ai compressé l’exécutable de Putty avec kkrunchy et UPX.

  • L’original fait une taille de 412 Ko.
  • Celui compressé par UPX fait un peu plus de 200 Ko.
  • Celui compressé par kkrunchy fait moins de 160 Ko.



unkk.png

Voici un unpacker pour sa version 0.23a et 0.23a2, qui sont les dernières releases en date depuis 3 ans.

J’ai tâché de faire en sorte que les exécutables en sortie soient relativement optimisés niveau taille, en déplacant et réinjectant certaines structures dans le PE.

Les sources ne sont pas excessivement commentées, voilà donc un bref résumé de ce que fait UnKK :

  • UnKK joue le rôle de débogueur pour l’exécutable cible. Il le trace au fur et à mesure jusqu’à arriver à l’Original Entry Point. Au passage, il intercepte dans la mémoire du processus cible, la liste des imports, ainsi que l’adresse où débute la décompression.
  • Le processus est alors dumpé en mémoire. Des corrections sont apportées de façon à obtenir un exécutable opérationnel :
  • L’Import Table est reconstituée à partir des informations obtenues en mémoire et réinjectée dans le PE (celle-ci a été totalement supprimée par kkrunchy) et l’IAT est reconstruite.
  • Les ressources, en partie déplacées dans le stub de kkrunchy, sont réinjectées dans le PE.
  • Le stub de kkrunchy est supprimé du fichier, l’ImageBase est corrigée.
  • Les RVA du PE sont recalculées par rapport à la nouvelle ImageBase.
  • Le padding est supprimé.
  • Les en-têtes PE sont corrigées pour la nouvelle taille.
  • Le dump est sauvegardé sur le disque.

Voilà le binaire et les sources. Merci de me faire part de tout bug ou correction à effectuer.

mercredi, décembre 5 2007

Unpacker UPX version 2 sous Linux

Suite au tutorial d'unpacking pour la version 1.25 d'UPX pour Linux, voici son homologue pour les versions 2.02 et 3.01, qui sont à l'heure actuelle les dernières en date La méthode présentée ici n'a plus rien à voir avec la précédente, la routine de décompression d'UPX a été grandement améliorée à partir de la 2.02 : plus de passage par un fichier temporaire sur le disque, toute la décompression se déroule dans l'espace d'adressage du processus.

Lire la suite...

Unpacker UPX version 1 sous Linux

Certaines personnes peuvent se demander quel est l’intérêt d’analyser ma- nuellement une routine de décompression au niveau binaire, alors que UPX est un opensource et qu’il suffirait donc juste de jeter un oeil au code. L’intérêt n’est evidemment pas dans l’unpacking lui même, mais dans les méthodes utilisées qui peuvent se retrouver pour l’analyse de packers dont les sources ne sont pas disponibles. De surcroit, UPX constitue un cas très simple à analyser et mettre en pratique ce qui présente l’avantage d’être un bon point de départ pour quelqu’un désirant s’investir dans le sujet. A l’heure où j’écris, UPX en est à sa version 3.01 et la méthode présentée dans cet article ne s’applique plus. Cependant il reste intéressant pour des débutants en rétroingénierie sur GNU/Linux.

Lire la suite...

mardi, décembre 4 2007

Blog EntryPoint

Premier blog, premier billet !

Il est vrai que les blogs ont plutôt le vent en poupe en ce moment, il faut bien que je me mette au goût du jour.

J'en profiterai donc pour publier ici les articles, les snippets ou releases en tout genre qui seraient susceptibles d'intéresser certaines personnes. Ceux-ci traiteront notamment de rétroingénierie et certaines seront publiés en parallèle sur le site de la FRET.