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
|
* `.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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue