Reverse de formats
Cette page est destinée aux recherches sur les méthodes de reverse de fichiers de formats et aux essais en cours.
Tailles de fichiers
PGCD
L'utilisation du PGCD de l'ensemble des tailles du format de fichier utilisé permet de voir si le fichier a une taille particulière. Si le PGCD est très grand 0x800 par exemple, ça peut vouloir dire que le header et l'ensemble du fichier est composé de CHUNKs de taille fixe.
PGCD et taille de header variable
L'objectif est de trouver un header de taille 1 fixe et des CHUNKs de taille 2 fixe :
|---- HEADER ----|------------ CHUNK 1 ------------|------------ CHUNK 2 ------------|------------ CHUNK N ------------|
Le script python affiche la taille de header pour lequel le PGCD des tailles de corps de fichiers est supérieur à un seuil donné :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# contient les tailles de fichiers
_list = [928, 3712, 4704, 11648, 14464, 16448, 20576, 32832, 32896, 38528, 77888, 115296, 143424, 573504, 2293888]
def pgcd(a,b):
"""pgcd(a,b): calcul du 'Plus Grand Commun Diviseur' entre les 2 nombres entiers a et b"""
while b != 0:
r= a % b
a, b=b, r
return a
def pgcd_list(_list, _pgcd = 0):
if _pgcd == 0:
_pgcd = _list.pop()
if len(_list) == 0 or _pgcd == 1:
return _pgcd
_pgcd = pgcd(_pgcd, _list.pop())
return pgcd_list(_list, _pgcd)
_list.sort()
max_header_len = _list[0]
header_len = 8
while header_len < max_header_len:
tmp_list = _list.copy()
for i in range(len(tmp_list)):
tmp_list[i]-=header_len
tmp_pgcd = pgcd_list(tmp_list)
if tmp_pgcd > 30 :
print("Header_len:"+str(header_len)+" PGCD:"+str(tmp_pgcd))
header_len+=1
Outils à tester
tester l'entropie avec binwalk (1. dans doku)
Doku
https://en.wikibooks.org/wiki/Reverse_Engineering/File_Formats