Contribuez à SecuObs en envoyant des bitcoins ou des dogecoins.
Nouveaux articles (fr): 1pwnthhW21zdnQ5WucjmnF3pk9puT5fDF
Amélioration du site: 1hckU85orcGCm8A9hk67391LCy4ECGJca

Contribute to SecuObs by sending bitcoins or dogecoins.



[WiShMaster - partie 2] Principe de shellcodisation avec WiShMaster (1)

Par Benjamin Caillat, Mastère Spécialisé Sécurité ESIEA
Le 16/09/2006


Résumé : WiShMaster permet de générer automatiquement un shellcode ; il prend en entrée des fichiers sources écrits « normalement », dont la compilation conduit habituellement à la génération d’un exécutable, et crée un shellcode optimisé (relocalisable et sans aucune référence externe).



WiShMaster (WIndows SHellcode Generator)


Présentation de WiShMaster

WiShMaster est un outil permettant de générer automatiquement un shellcode suivant le principe décrit précédemment. Il prend en entrée un ensemble de fichiers sources écrits « normalement », dont la compilation conduit habituellement à la génération d’un exécutable, et crée un shellcode, c'est-à-dire un bloc d’octets relocalisable et sans aucune référence externe.

Si l’on transfert l’exécution au premier octet du shellcode, celui-ci va alors accomplir exactement les mêmes opérations que le programme d’origine. WiShMaster est un freeware disponible sur mon site personnel ( lien ). Cette page contient également le manuel d’utilisation et quelques vidéos de démonstration.


Principe de la shellcodisation par WiShMaster


Description technique du processus de shellcodisation

La transformation exécutée par WiShMaster est découpée en 7 étapes. Différents flots d’exécutions peuvent être suivis, en fonction du résultat que l’on souhaite obtenir. Le flot le plus complet part d’un ensemble de fichiers sources « normaux » et produit un exécutable contenant le shellcode encodé par une clé XOR. Cet exécutable va par exemple déchiffrer le shellcode, puis transférer l’exécution dessus.

Voici une courte description de ces 7 étapes :


- Etape 1 : Analyse

L’étape d’analyse consiste à parcourir l’ensemble des fichiers sources afin de dresser la liste des références dont nous avons parlé dans la première partie : les fonctions internes, les fonctions importées et les chaînes de caractères.

- Etape 2 : Create

Cette deuxième étape consiste à créer une copie de l’arborescence des fichiers sources en modifiant le code pour que la compilation produise un code relocalisable. Cette étape suit exactement le principe présenté dans la deuxième partie : Une structure GLOBAL_DATA est déclarée et toutes les références sont modifiées pour se baser sur cette structure.

- Etape 3 : Compile

WiShMaster compile ensuite ces sources patchées afin de produire un exécutable.

- Etape 4 : Extract

Lors de cette étape, WiShMaster va extraire le code des différentes fonctions et la structure GLOBAL_DATA de l’exécutable précédemment généré, puis les assembler pour former une première version du shellcode.

- Etape 5 : Generate

L’étape de génération consiste à créer plusieurs versions du shellcode en patchant certaines données. A l’issue de cette étape, nous obtenons plusieurs shellcodes.

- Etape 6 : Xor

Chacun des shellcodes générés va alors être xoré avec une clé différente.

- Etape 7 : Integrate

Enfin, WiShMaster va successivement inclure chaque shellcode xoré dans un fichier header d’une autre arborescence de fichiers sources sous forme d’un tableau de char, et lancer la compilation de cet autre programme.

A la fin de cette ultime étape, nous obtenons un ensemble de fichiers exécutables contenant des versions xorées de notre shellcode. Le schéma ci-dessous résume les éléments produits lors des différentes étapes :






Les conventions d’écriture du code

WiShMaster impose cependant plusieurs contraintes sur le code source d’origine. Tout d’abord, le code est analysé via des expressions régulières et doit donc suivre une notation relativement classique.

Par exemple, WiShMaster ne reconnaîtra pas la déclaration de fonction suivante à cause du changement de ligne entre le « void » et « MyFunc » :


void
MyFunc(int a)
{
printf("%d", a);
}



Ensuite, le code doit comporter au maximum une seule variable globale. Dans le cas où plusieurs variables seraient nécessaires, il faut donc les inclure dans une structure globale unique.

Structure du shellcode généré.

Pour mieux comprendre le principe de génération du shellcode, prenons l’exemple du code suivant :


typedef struct __MYDATA
{
int a;
char szMsg[10];
} MYDATA, * LPMYDATA;

MYDATA MyData =
{
0,
"Hello"
};

void MyFunc(int a)
{
printf("Paramètre passé : %d\n", a);
if(a == MyData.a)
printf("Les valeurs sont identiques\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
MyFunc(7);

return 0;
}



Ce code comporte :

- deux fonctions : « _tmain » et « MyFunc »,
- une fonction importée « printf »,
- une structure globale initialisée.

Le shellcode formé par WiShMaster aura la structure suivante :






Au début du buffer, nous trouvons une fonction BuildReferences, ajoutée par WiShMaster qui va se charger de retrouver l’adresse de la structure globale et d’effectuer son initialisation. Elle est suivie du code de toutes les fonctions internes : _tmain et MyFunc dans notre cas.

La seconde partie du buffer est constitué de la structure globale. Celle-ci commence par la structure globale du programme d’origine (un integer à 0 suivi d’un tableau de dix chars contenant la chaîne « Hello »), suivi des pointeurs de fonctions internes et des pointeurs de fonctions importées.

Elle se termine enfin par les différentes chaînes de caractères détectées ("Paramètre passé : %d\n" et "Les valeurs sont identiques\n" dans notre cas).

Autres ressources dans ce même dossier :

[WiShMaster - Partie 1] Introduction à l'ecriture de shellcodes en C - lien

[WiShMaster - Partie 3] Principe de shellcodisation avec WiShMaster (2) - lien

[WiShMaster - Partie 4] Principe et Fonctionnement - RConnect/WiShMaster Vs firewalls personnels (1) - lien

[WiShMaster - Partie 5] Principe et Fontionnement - RConnect/WiShMaster Vs firewalls personnels (2) - lien

[WiShMaster - Partie 6] Principe et Fonctionnement - RConnect/WiShMaster Vs firewalls personnels (3) - lien

[WiShMaster - Partie 7] Résultat de RConnect avec des firewalls personnels et conclusion - lien