Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

File formats reverse engineering: Difference between revisions

No edit summary
No edit summary
Line 13: Line 13:
\#!/usr/bin/env python3<br># -*- coding: utf-8 -*-
\#!/usr/bin/env python3<br># -*- coding: utf-8 -*-


\# contient les tailles de fichiers<br>_list = [928, 3712, 4704, 11648, 14464, 16448, 20576, 32832, 32896, 38528, 77888, 115296, 143424, 573504, 2293888]
# contient les tailles de fichiers<br>_list = [928, 3712, 4704, 11648, 14464, 16448, 20576, 32832, 32896, 38528, 77888, 115296, 143424, 573504, 2293888]


def pgcd(a,b):<br>&nbsp; &nbsp; """pgcd(a,b): calcul du 'Plus Grand Commun Diviseur' entre les 2 nombres entiers a et b"""<br>&nbsp; &nbsp; while b != 0:<br>&nbsp; &nbsp; &nbsp; &nbsp; r= a % b<br>&nbsp; &nbsp; &nbsp; &nbsp; a, b=b, r<br>&nbsp; &nbsp; return a
def pgcd(a,b):<br>&nbsp; &nbsp; """pgcd(a,b): calcul du 'Plus Grand Commun Diviseur' entre les 2 nombres entiers a et b"""<br>&nbsp; &nbsp; while b != 0:<br>&nbsp; &nbsp; &nbsp; &nbsp; r= a % b<br>&nbsp; &nbsp; &nbsp; &nbsp; a, b=b, r<br>&nbsp; &nbsp; return a

Revision as of 20:59, 16 November 2021

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 -*-

  1. 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

https://hexinator.com/

tester l'entropie avec binwalk (1. dans doku)

Doku

1. https://archive.fosdem.org/2021/schedule/event/reverse_engineering/attachments/slides/4518/export/events/attachments/reverse_engineering/slides/4518/Reverse_Engineering_of_binary_File_Formats.pdf

https://en.wikibooks.org/wiki/Reverse_Engineering/File_Formats