Add Win PE format

This commit is contained in:
Yorick Barbanneau 2023-09-24 23:58:52 +02:00
parent a17a401f00
commit 324179092e

View file

@ -206,7 +206,7 @@ soit des données brutes:
* `.bss` : des données non initialisées * `.bss` : des données non initialisées
* `.rodata` : des données en lecture seule comme les constantes statiques * `.rodata` : des données en lecture seule comme les constantes statiques
### Le format ELF ## Le format ELF
Comme nous le disions, c'est le format binaire d'enregistrement de code compilé Comme nous le disions, c'est le format binaire d'enregistrement de code compilé
utilisé par la plupart des systèmes de type *Unix*. Il commence par les nombres utilisé par la plupart des systèmes de type *Unix*. Il commence par les nombres
@ -224,7 +224,7 @@ Enfin le fichier ELF contient les données référencées par ces deux tables.
[^n_magic]: dans notre cas, ensemble de caractères utilisés pour désigner un [^n_magic]: dans notre cas, ensemble de caractères utilisés pour désigner un
format de fichier. format de fichier.
## Pratique ## ELF : Pratique
### Propriété de `ls` ### Propriété de `ls`
@ -247,11 +247,35 @@ Il est aussi possible de récolter plus d'informations avec `readelf` notamment
la version de la *libc* utilisée. Ce genre d'information peut permettre de mener la version de la *libc* utilisée. Ce genre d'information peut permettre de mener
une attaque. une attaque.
### les sections `.plt` et `.got`
Ces différentes sections permette la résolution de symboles. `.plt` signifie
*Procedure Linkag Table* et `.got` *Global Offset Table*. On parle alors de
relocation.
Pour la section `.plt`, toutes ses entrées sont initialisées pour pointr vers
l'editeur du lien et non l'adresse de la bonne fonction. C'est lors de premier
appel de la fonction en question que sont adresse sera résolue - elle st donc
effectuée au *runtime* - et mise à jour. On parle alors de *lazy symbols
binging*
La section `.got` fait plus office d'annuaire référençant juste les adresss de
fonctions mais aussi de variables globales des bibliothèques).
#### `.got` et `plt.got
Ces deux sections sont utilisés pour les symboles ayant besoin d'être résolus
**au moment du chargement du binaire en mémoire**.
#### `.plt` et `.got.plt`
Ces deux sections se chargent de la résolution fainéante.
### Segments et sections avec `realelf` ### Segments et sections avec `realelf`
#### Le segment `GNU_STACK` #### Le segment `GNU_STACK`
Il permet la configuration de la pile lorsque le binaire est charge. Il sert par Il permet la configuration de la pile lorsque le binaire est chargé. Il sert par
exemple à la mise en place de protection (pile non exécutable par exemple). exemple à la mise en place de protection (pile non exécutable par exemple).
#### Le segment `GNU_RELRO` #### Le segment `GNU_RELRO`
@ -263,3 +287,53 @@ une fois la résolution des symboles effectuée. Il existe deux type :
* **partiel**: seule la `.got` est en lecture seule. * **partiel**: seule la `.got` est en lecture seule.
*[ELF]: Executable and Linkable Format *[ELF]: Executable and Linkable Format
## Le format PE
PE pour *Portable Execution* est le format de binaire utilisé par Microsoft
Windows. Comme pour Linux, un *loader* réalise l'analyse et le chargement du
binaire en mémoire. Dans ce format, la notion de segment n'existe pas, mais il
se compose de 3 entêtes :
* un reliquat de l'ère MS DOS avec comme *magic number* `MZ`. cette section
affiche un message d'erreur du style *Ce programme ne n'exécute pas en mode
MSDOS* lors de son exécusion en mode DOS;
* une entête *PE* avec comme *magic number* `PE`;
* une entête optionnelle.
Il se compose aussi:
* une partie *data directories*;
* une table des sections (`text`, `data`, etc.);
* les sections en questions (avec leurs entêtes).
### CFF explorer
Ce programme disponible uniquement pour Windows permet d'analyser les fichiers
binaires (exécutable, bibliothèques, etc.).
### Entête optionnelle
Elle est quasiment tout le temps présente et permet notamment de définir le
point d'entrée (*entrypoint*), d'activer les protections comme l'ASLR ou autre
mécanismes de sécurité.
### Entête *data directories*
Elle contient la localisation et la taille de chaque `directory`. Ces
*directories* sont de plusieurs natures :
* signatures cryptographiques;
* icônes;
* configurations;
* *export-table* : référençant les fonctions exportées par le binaire;
* *import-table* : référençant les DLL importées par le binaire, les fonctions
issues de ces DLL sont référencées dans l'*Imports Address Table*;
* *relocation table* : table référençant les relocations.
Plusieurs *directories* peuvent appartenir à une section.
### Entêtes de sections
Elles contiennent les information relatives à leurs sections respectives : nom,
adresse virtuelle, taille, droit d'accès.