From 324179092e21e8e82618388a21d0fd5f7f2fde66 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Sun, 24 Sep 2023 23:58:52 +0200 Subject: [PATCH] Add Win PE format --- content/secu_systeme/1_introduction/index.md | 80 +++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/content/secu_systeme/1_introduction/index.md b/content/secu_systeme/1_introduction/index.md index dcb23ad..e34b8b5 100644 --- a/content/secu_systeme/1_introduction/index.md +++ b/content/secu_systeme/1_introduction/index.md @@ -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.