Analyser un fichier binaire ou un programme inconnu
Par haypo, vendredi 18 janvier 2008 à 00:27 :: Sécurité informatique :: #114 :: rss
Cet article explique comment analyser un fichier d'origine peu sûre (ex: Internet) ou dont le format est inconnu (rétro-ingénierie). Il n'est sûrement pas exhaustif, mais liste divers outils bien pratiques pour ce genre de travail.
Avertissement
Lorsqu'on traite un fichier d'origine inconnue, il faut être sur ses gardes. Il se peut que le fichier attaque volontairement les outils d'analyse cités dans cet article. Les virus sont connus pour cracher les débogueurs et/ou changer leur propre comportement lorsqu'ils sont analysés. Travaillez sur une machine dédiée aux tests (ex: machine virtuelle), ou bien avec des privilèges minimaux (ex: machine coupée du réseau).
Détecter le type d'un fichier inconnu
Quand on reçoit un fichier binaire d'un type inconnu, le programme le plus utile est file. Il détermine le format du fichier à partir d'une importante base de signature. Il sait extraire certaines méta-données (dimension d'une image, version du format, etc.) et sait également faire la différence entre les sous-formats (tel que AVI ou WAVE pour le format RIFF, et Theora et Vorbis pour Ogg).
D'autres programmes peuvent servir pour identifier le format ou plutôt extraire les méta-données :
- hachoir-metadata : supporte un grand nombre de formats de fichiers
- extract : supporte un grand nombre de formats de fichiers
- Kaa : images, sons et vidéos
- identify : images, fait parti de l'excellente suite Image Magick
Analyse manuelle d'un fichier binaire
Le programme strings sert à extraire des chaînes de caractères d'un fichier binaire. Il vous faudra peut-être tester différentes options (encodages des chaînes) pour obtenir satisfaction. Souvent, strings donne beaucoup de faux positifs (la sortie est assez bruitée).
Un éditeur hexadécimal est toujours pratique pour rechercher visuellement des motifs, des chaînes de caractères, informations cachées, etc. J'utilise « hexdump -C fichier » ou bien khexedit (programme KDE).
Quand un fichier semble vraiment trop aléatoire, il se peut qu'il soit compressé et/ou chiffré. J'ai écrit un petit script « entropy.py » qui calcule l'entropie des symboles (mot de 8 bits) d'un fichier. Quelques exemples :
- Programme EXE PE : 4,11 bits/symbole
- Page HTML : 4,89 bits/symbole
- Document PDF : 7,75 bits/symbole
- Image JPEG et PNG : 7,87 et 7,82 bits/symbole
- Archive gzip (.tar.gz) et bzip2 (.tar.bz2) : 7,99 bits/symbole
Au delà de 7,5 bits/symbole, il y a de fortes chances que le fichier contienne des champs compressés. C'est le cas dans les exemples, mais cet outil n'est qu'une mesure empirique.
Pour trouver les blocs compressés, une solution est de tenter de décompresser à partir du 1er octet, puis du 2e, etc. Le script « find_deflate.py » implémente justement cet algorithme, lent mais il fonctionne.
Enfin, l'outil hachoir-subfile permet de rechercher les fichiers contenu dans un fichier binaire en recherchant des motifs (marqueur de début, marqueur de fin) et en vérifiant que le fichier trouvé est valide (pour limiter les faux positifs). Il existe beaucoup d'outils similaires tels que Photorec et Scalpel, ou encore TestDisk et Sleuth Kit qui sont eux dédiés à l'analyse d'images de disque dur.
Analyse statique d'un programme
Ayant majoritairement travaillé sous Linux, je ne parlerai que des programmes ELF. L'outil objdump affiche de nombreuses informations sur un fichier ELF tel que ses sections, les symboles (objdump -T fichier) et sait désassembler du code. L'outil nm liste les symboles des bibliothèques statiques (extension du fichier « .a »). L'outil ldd liste les bibliothèques importés par un programme ou une bibliothèque avec le chemin complet qui sera utilisé. Enfin, elfsh est une suite complète d'outils pour l'analyse de fichier ELF.
Analyse dynamique
Analyser un programme sans l'exécuter ne permet que d'extraire de maigres informations. Il est toujours plus instructif de l'exécuter. Il existe de nombreux outils pour tracer un programme. strace affiche les appels systèmes. ltrace affiche les appels aux bibliothèques dynamiques, mais sait également tracer les appels systèmes. gdb est le grand classique parmis les débogueurs, boîte à tout faire.
Pendant l'exécution du programme, « lsof -p pid » affiche les fichiers qu'il a ouvert et « netstat » permet d'afficher les connexions réseaux.
Autres outils que je n'ai pas testé :
- auditd : lire l'article Surveiller les connexions avec auditd de devloop
- truss (BSD et Solaris)
- Dtrace pour Solaris et BSD
- systrace
- Frysk
- SystemTap
J'ai écrit un binding Python pour ptrace qui permet d'écrire facilement son propre outil d'audit à la manière de strace ou ltrace. Enfin, mon bref article Syscall contient mes divers notes sur les appels systèmes Linux.
Sites Internet
Pour en savoir plus sur le sujet, voici quelques sites très instructifs :
- ERESI Project : Rétro-ingénierie et forensic
- openrce.org : Rétro-ingénierie de programme Windows (EXE), avec beaucoup d'informations sur le désassembleur IDA
- forensicswiki.org : Forensic
- reverse-engineering.net : Forums dédiés à la rétro-ingénierie
- Digital Forensic Research Workshop (DFRWS) : Groupe de travail sur le forensic qui lance régulièrement des concours très intéressants
Commentaires
1. Le samedi 19 janvier 2008 à 13:39, par Misc
2. Le mardi 12 octobre 2010 à 10:44, par gucci shoes
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.