Ghosts In The Stack

md5pack et md5unpack

Créateur : Trance

Date de création : 02/04/2007

Section : Sécurité > Cryptographie

Télécharger md5pack et md5unpack

Outils permettant de creer deux archives de même hashes MD5 à partir de deux fichiers de hashes différents, et d'extraire ces fichiers.

Note : Ceci n'est que le manuel d'utilisation des deux outils md5pack et md5unpack. Pour une description complète et détaillée de leur fonctionnement, je vous recommande fortement de lire l'article sur l'exploitation des collisions MD5.

Sommaire

  1. md5pack
  2. md5unpack

Introduction

Ces deux outils exploitent les collisions de l'algorithme MD5 et permettent de produire et d'extraire des fichiers différents de deux archies qui ont le même hash MD5. Ils ont été développés pour fonctionner sous Linux, mais fonctionnent logiquement de la même façon sous Windows (il se peut qu'il faille retoucher quelques fichiers inclus).

L'archive distribuée se compose de deux sous-dossier qui contiennent tous les deux 4 fichiers : header.h, main.c, fichiers_bib.c et fichiers_bib.h. Leur compilation est identique et se fait soit avec le Makefile fourni (en tapant "make"), soit avec les commandes :

$ gcc -c main.c
$ gcc -c fichiers_bib.c
$ gcc -o executable main.o fichiers_bib.o

En remplaçant bien entendu "executable" par "md5pack" ou "md5unpack" selon le dossier dans lequel vous êtes.

Ces deux outils sont censés être stables. En effet, je n'ai renconté aucun bug en les utilisant. Je diffuse ces deux programme sous licence GPL v2. Libre à vous de corriger les éventuels bugs et d'aaméliorer ces outils :)

1. md5pack

Il s'agit du packer. Il prend en entrée deux fichiers différents (ils peuvent être exécutables) et rend en sortie deux archives binaires de même hashes MD5, qui contiennent les deux fichiers.

Utilisation :
md5pack fichiersource1 fichiersource2 fichiercible1 fichiercible2
[/code

<p>L'ordre dans lequel les arguments sont passés est important. Le programme cree les deux archives "fichiercible1" et "fichiercible2" à partir de "fichiersource1" et "fichiersource2". Lors de l'extraction future avec md5unpack, "fichiercible1" donnera "fichiersource1", et "fichiercible2" donnera "fichiersource2".</p>

<p>Voici un exemple d'utilisation, sur deux programmes faits en C :</p>

[code=code]

/* gentil.c */

#include <stdlib.h>
#include <stdio.h>


int main(){
    printf("Je suis gentil !\n");
}
/* mechant.c */

#include <stdlib.h>
#include <stdio.h>


int main(){
    printf("Je suis mechant !\n");
}

On les compile :

$ gcc -o gentil ./gentil.c
$ ./gentil
Je suis gentil !
$ gcc -o mechant ./mechant.c
$ ./mechant
Je suis mechant !

Les deux programmes fonctionnent. On constate au passage qu'ils n'ont pas le même hash MD5 :

$ md5sum gentil
8bd94852729ce6332992578c35000367  gentil
$ md5sum mechant
f2b485d7ac8cb2792789e3ce4ff69b29  mechant

On les passe maintenant à md5pack :

$ ./md5pack
Utilisation :
md5pack fichiersource1 fichiersource2 fichiercible1 fichiercible2
$ ./md5pack gentil mechant gentil.bin mechant.bin
Fichier gentil.bin cree.
Fichier mechant.bin cree.

Et on constate que les deux archives créées ont le même hash.

$ md5sum gentil.bin
4db54b9789b9163de00b42e3d3135d08  gentil.bin
$ md5sum mechant.bin
4db54b9789b9163de00b42e3d3135d08  mechant.bin

Et en plus, elles ont la même taille.

$ ls -l | grep gentil.bin
-rwxrwxrwx 1 root root 13389 2007-04-02 13:17 gentil.bin
$ ls -l | grep mechant.bin
-rwxrwxrwx 1 root root 13389 2007-04-02 13:17 mechant.bin

Il est dont dur de les différencier. La seule solution pour le détecter serait de faire un diff :

$ diff gentil.bin mechant.bin
Les fichiers binaires gentil.bin et mechant.bin sont différents.

2. md5unpack

md5unpack prend en entrée une archive crée avec md5pack, et extrait le bon fichier en fonction du header de l'archive.

Utilisation :
md5unpack archive.bin fichier

Le programme extrait l'archie "archive.bin" dans le fichier "fichier". Voici un exemple d'utilisation, à partir des archives "gentil.bin" et "mechant.bin" crées précédemment avec md5pack :

$ md5sum gentil.bin
4db54b9789b9163de00b42e3d3135d08  gentil.bin
$ md5sum mechant.bin
4db54b9789b9163de00b42e3d3135d08  mechant.bin
$ ./md5unpack gentil.bin monexe
Fichier monexe extrait.
$ md5sum monexe
8bd94852729ce6332992578c35000367  monexe
$ ./monexe
Je suis gentil !
$ ./md5unpack mechant.bin monexe
Fichier monexe extrait.
$ md5sum monexe
f2b485d7ac8cb2792789e3ce4ff69b29  monexe
$ ./monexe
Je suis mechant !

Notez que le comportement du programme n'est pas prévu lorsqu'on lui passe un fichier quelconque qui n'a pas été produit avec md5pack...

J'espère que ces programmes vous seront utiles. Vous êtes libre de les améliorer et de les rediffuser, au sens de la GPL v2.