Add Win PE format
This commit is contained in:
parent
a17a401f00
commit
324179092e
1 changed files with 77 additions and 3 deletions
|
@ -206,7 +206,7 @@ soit des données brutes:
|
|||
* `.bss` : des données non initialisées
|
||||
* `.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é
|
||||
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
|
||||
format de fichier.
|
||||
|
||||
## Pratique
|
||||
## ELF : Pratique
|
||||
|
||||
### 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
|
||||
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`
|
||||
|
||||
#### 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).
|
||||
|
||||
#### 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.
|
||||
|
||||
*[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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue