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

Annulation des modifications 218 de Administrateur (discussion)
Tag: Undo
No edit summary
Line 11: Line 11:
Le script python affiche la taille de header pour lequel le PGCD des tailles de corps de fichiers est supérieur à un seuil donné :
Le script python affiche la taille de header pour lequel le PGCD des tailles de corps de fichiers est supérieur à un seuil donné :


<code class="mwt-code" >#!/usr/bin/env python3</code><br><code class="mwt-code" ># -*- coding: utf-8 -*-</code>


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


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


<code class="mwt-code" >def pgcd_list(_list, _pgcd = 0):</code><br><code class="mwt-code" >&nbsp; &nbsp; if _pgcd == 0:</code><br><code class="mwt-code" >&nbsp; &nbsp; &nbsp; &nbsp; _pgcd = _list.pop()</code><br><code class="mwt-code" >&nbsp; &nbsp; if len(_list) == 0 or _pgcd == 1:</code><br><code class="mwt-code" >&nbsp; &nbsp; &nbsp; &nbsp; return _pgcd</code>
<code class="mwt-code" >&nbsp; &nbsp; _pgcd = pgcd(_pgcd, _list.pop())</code><br><code class="mwt-code" >&nbsp; &nbsp; return pgcd_list(_list, _pgcd)</code>
<code class="mwt-code" >_list.sort()</code><br><code class="mwt-code" >max_header_len = _list[0]</code><br><code class="mwt-code" >header_len = 8</code><br><code class="mwt-code" >while header_len &lt; max_header_len:</code><br><code class="mwt-code" >&nbsp; &nbsp; tmp_list = _list.copy()</code><br><code class="mwt-code" >&nbsp; &nbsp; for i in range(len(tmp_list)):</code><br><code class="mwt-code" >&nbsp; &nbsp; &nbsp; &nbsp; tmp_list[i]-=header_len</code><br><code class="mwt-code" >&nbsp; &nbsp; tmp_pgcd = pgcd_list(tmp_list)</code><br><code class="mwt-code" >&nbsp; &nbsp; if tmp_pgcd &gt; 30 :</code><br><code class="mwt-code" >&nbsp; &nbsp; &nbsp; &nbsp; print("Header_len:"+str(header_len)+" &nbsp;PGCD:"+str(tmp_pgcd))</code><br><code class="mwt-code" >&nbsp; &nbsp; header_len+=1</code>


== Outils à tester ==
== Outils à tester ==

Revision as of 21:02, 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 -*-

# 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