samedi 22 décembre 2007

Ownz fucking PE ou Comment corrompre un binaire?

Bonjour à tous,
En ce début de vacance, j'en profite pour vous faire part d'un petit article plutôt sympathique je trouve.
Il portera sur la corruption du Portable Executable, abrégé PE.
J'ai décidé de faire un tel article, pour m'introduire au vxing, ou l'art de créer un virus.
Le but de cet article est non pas de pouvoir comprendre comment un virus se reproduit ou autres, mais de s'amuser avec le PE.
Ce bricolage est, je trouve extremement intérréssant dans le sens ou l'on va jouer au 'bob le bricoleur'.
Le code illustrant l'article est enfaite un petit binaire qui va infecter un PE.
Il va l'infecter en lui faisant éxecuter une messagebox toute simple.
Je vous expose donc la technique que j'ai utilisé :

- On mappe le fichier en mémoire pour avoir une plus grande aisance à modifier le PE.
- On va ajouter une entête de section (IMAGE_SECTION_HEADER).
- On va incrementer le membre spécifiant le nombre de section au sein du binaire.
- On incremente la SizeOfImage de la taille de notre section, autrement dit on lui ajoute la taille de notre section.
- On va aussi rediriger le point d'entré de l'éxécutable sur notre futur section.
- On démappe le fichier.
- On l'ouvre CreateFile, on utilise SetFilePointer pour se positionner au PointerToRawData (membre de la structure IMAGE_SECTION_HEADER).
- On écrit en dur notre section.
- On écrit aussi l'adresse du 'vrai' point d'entré.
- On remplit la différence entre la taille écrite et la taille spécifié dans le PE c'est à dire la taille aligné sur le fileAlignment.

Voilà comment nous allons opérer notre binaire.
J'ai oublié de préciser que notre section sera composée d'un shellcode essentiellement (codé par 0mega7 et modifié par Baboon).
J'ai donc ajouter un jmp à la fin de notre shellcode, c'est pour cela qu'après l'avoir écrit, nous écrivons l'adresse du vrai point d'entré : Pour sauter dessus !
Bon je suis tout à fait d'accord avec vous, c'est un peu laborieux mon histoire, mais en codant ce pseudo-infecteur on y apprend, plusieurs choses comme l'alignement des données.
J'entend déjà d'ici les gouroux vxers me huer, je leur répondrais que c'est une étape avant de coder mon propre petit vx, prochain article peut être :).
Pour réaliser un tel code il faut absolument avoir une documentation détaillé sur le portable executable, biensure, je vous fournis ça en fin d'article.
Je voulais aussi revenir sur l'alignement des données : c'est enfaite avoir une taille multiple d'une autre définit dans le pe, tout simplement pour une manipulation plus aisée.
N'oublier pas d'utiliser LordPE, un outil vraiment génial pour controler les actions menées sur le PE, vérifier le nombre de section et j'en passe.
C'est un peu tout ce que j'ai à dire pour ce petit code, voici :
un petit screenshot :



le code : OwnzFuckingPE.c

Liens : - LA documentation -> http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf .
- Pour vous documenter un peu sur le vxing -> http://ebixad.next-touch.com/repo/Vxing/Vx%20guide/intro.html .

L'article est normalement terminé, mais je tenais à vous faire part d'un petit crackme avec un niveau vraiment simple.
Ce qui m'a intéréssé c'est de coder le keygen, car il fallait tout simplement aller lire dans la mémoire du processus.
Juste un petit code de quelques lignes histoire d'illustrer l'api ReadProcessMemory.
Un petit Screenshot :



Le petit code : KeygenDefiGutte1.c

Voilà bonne journée à vous, en esperant que cela vous à intéréssé, cya.

PS : N'oublier pas de changer les adresses qui sont dites, hardcodé dans le shellcode.

3 commentaires:

KERNEL_ERROR a dit…

ZOMFG !
C'est exactement ce qu'on cherchait..
Franchement, GOOD JOB 0vercl0k !
Tu me fait un joli cadeaux de noël ^^

Baboon a dit…

J'ai pas fait grand chose sur le shellcode hein

Sinon bravo ;)

Maintenant tu nous fais un vrai virus hein !

Stbg a dit…

Oep on attends le VX now t'es foutu :p