Outils d'utilisateurs

Outils du Site


injection_elf

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

injection_elf [2012/07/06 20:56]
statl3r Ajout d'outils
injection_elf [2019/10/14 20:42] (Version actuelle)
M0N5T3R
Ligne 1: Ligne 1:
 +**Le PAD pour améliorer cette page :** https://pad.zenk-security.com/p/merci
 +
 +
 +
 +
 +
 ====== L'article n'est pas du tout fini. Ne pas le mettre dans le sommaire ! ====== ====== L'article n'est pas du tout fini. Ne pas le mettre dans le sommaire ! ======
 TODO TODO
Ligne 4: Ligne 10:
   * Expliquer différentes injections   * Expliquer différentes injections
  
-Cette article va vous présenter comment injecter du code de manière statique dans un fichier ELF, que ce soit sur architecture 32 bits ou 64 bits, sous une distribution GNU/Linux.+Cet article va vous présenter les différentes techniques qui existent afin d'injecter du code de manière statique dans un fichier ELF, que ce soit sur architecture 32 bits ou 64 bits, sous une distribution GNU/Linux.
  
 ====== 1. Le format ELF ====== ====== 1. Le format ELF ======
-Les fichiers ELF (Executable and Linking Format) peuvent être des exécutables normaux (ls, dd, ponysay,...), des bibliothèques partagées (libcrypto.so, libglib.so,...), des fichiers core (core dump) et des fichiers objets (les fichiers .o générés pas les compilateurs qui n'ont pas encore été liés pour devenir des exécutables). 
  
-Un fichier ELF va être constitué d'un en-tête et soit d'une table d'en-tête de programme ou d'une table des en-têtes de sectionsou alors des deuxDans notre casil est nécessaire de posséder la table d'en-tête de programmede toute manière celle-ci est obligatoire pour les exécutablesEn effet, cette partie va contenir les informations sur les sections du programme qui vont comprendre le code qui sera mappé dans l'espace d'adressage du programme.+=====  Différents types de fichiers ELF ===== 
 +Les fichiers ELF (Executable and Linkable Format) peuvent permettre d'enregistrer différents types de fichier : 
 +  * Exécutables normaux : ls, dd, ponysay,... 
 +  * Bibliothèques partagées : libcrypto.solibglib.so,... 
 +  * Fichiers core : core dump  
 +  * Fichiers objets : les fichiers .o générés pas les compilateurs qui n'ont pas encore été liés
  
 ===== Outils ===== ===== Outils =====
 Afin d'analyser un fichier ELF différents outils existent : Afin d'analyser un fichier ELF différents outils existent :
-  * **readelf** Permet d'afficher différents informations concernant un fichier ELF +  * **readelf** Permet d'afficher différentes informations concernant un fichier ELF 
-  * ** file ** Affiche différentes informations sur le fichier ELF +  * ** file ** Affiche différentes informations sur le fichier ELF 
-  * ** dumpelf ** Dump toutes les informations sur la structure d'un fichier ELF en équivalent d'une structure en C +  * ** dumpelf ** Dump toutes les informations sur la structure d'un fichier ELF en équivalent d'une structure en C 
-  * ** lddtree ** Montre l’arbre des dépendances d'un fichier ELF+  * ** lddtree ** Montre l’arbre des dépendances d'un fichier ELF
   * ** objdump **   * ** objdump **
   * ** scanelf **    * ** scanelf ** 
Ligne 23: Ligne 33:
   * ** IDA **   * ** IDA **
  
-===== ELF header =====+===== En-tête ELF ===== 
 +Un fichier ELF va être constitué d'un en-tête et soit d'une table d'en-tête de programme ou d'une table des en-têtes de sections, soit les deux. Dans notre cas, il est nécessaire de posséder la table d'en-tête de programme, celle-ci est obligatoire pour les exécutables. En effet, cette partie va contenir les informations sur les sections du programme qui vont comprendre le code qui sera mappé dans l'espace d'adressage du programme. 
 Voici la représentation de l'en-tête ELF (32 bits) sous la forme d'une structure C : Voici la représentation de l'en-tête ELF (32 bits) sous la forme d'une structure C :
 <file C /usr/include/elf.h 65-85> <file C /usr/include/elf.h 65-85>
Ligne 59: Ligne 71:
 Pour une description plus détaillé des différents champs, référez-vous au ''man elf'' Pour une description plus détaillé des différents champs, référez-vous au ''man elf''
  
-===== Program header =====+===== Table d'en-tête de programme =====
  
 Voici la structure en C représentant un élément de la table d'en-tête de programme d'un ELF (32 bits) : Voici la structure en C représentant un élément de la table d'en-tête de programme d'un ELF (32 bits) :
Ligne 78: Ligne 90:
 </file> </file>
  
-Le champ p_type va contenir le type du segment (LOAD, DYNAMIC, NOTE,...), nous ne nous intéresserons qu'au segment LOAD. Généralement, il y aura 2 segments LOAD, le premier ayant les flags (p_flags) Readable & Executable, qui va correspondre à la seciont .text (Le code du programme) et le second qui aura les flags Readable & Writable, qui va correspondre aux section .data (Les variables globales) et .bss (Les variables non initialisés). Bien entendu, cela n'est pas obligé, ils peuvent contenir d'autres sections en plus, et avec différents flags, il s'agit là du cas général.+Le champ p_type va contenir le type du segment (LOAD, DYNAMIC, NOTE,...), nous ne nous intéresserons qu'au segment LOAD. Généralement, il y aura 2 segments LOAD, le premier ayant les flags (p_flags) Readable & Executable, qui va correspondre à la section .text (Le code du programme) et le second qui aura les flags Readable & Writable, qui va correspondre aux sections .data (Les variables globales) et .bss (Les variables non initialisés). 
 +Bien entendu, cela n'est pas obligé, ils peuvent contenir d'autres sections en plus, et avec différents flags, il s'agit là du cas général.
  
 Les segments LOAD vont donc être chargés depuis le fichier pour être mappés au début du segment de la mémoire. Les segments LOAD vont donc être chargés depuis le fichier pour être mappés au début du segment de la mémoire.
Ligne 115: Ligne 128:
  
 Vous pouvez voir ici un exécutable où on y voit sa table d'en-têtes de programme (Program Headers) et les différents segments associés (Section to Segment mapping). Chaque éléments (LOAD, DYNAMIC,...) vont respectivement correspondre aux numéros des segments. Le segment 0 correspond à un segment PHDR, le 3 à un segment LOAD,...  Vous pouvez voir ici un exécutable où on y voit sa table d'en-têtes de programme (Program Headers) et les différents segments associés (Section to Segment mapping). Chaque éléments (LOAD, DYNAMIC,...) vont respectivement correspondre aux numéros des segments. Le segment 0 correspond à un segment PHDR, le 3 à un segment LOAD,... 
 +
 +===== Table des en-têtes de sections =====
 +blabla
 +
  
 ====== 2. Injection entre 2 segments LOAD ====== ====== 2. Injection entre 2 segments LOAD ======
  
-Nous allons maintenant voir comment il est possible d'insérer du code entre 2 segments LOAD sans changer la taille du fichier. En effet, dû à l'alignement il y aura de l'espace inutilisé entre 2 segments LOAD. Cependant, cette espace n'est pas toujours très grand il faudra donc vérifier qu'il y ait suffisamment de place pour y mettre notre code.+Nous allons maintenant voir comment il est possible d'insérer du code entre 2 segments LOAD sans changer la taille du fichier. En effet, dû à l'alignement ((http://stackoverflow.com/questions/2391865/what-is-alignment-field-in-binary-formats-why-is-it-needed)) il y aura de l'espace inutilisé entre 2 segments LOAD. Cependant, cette espace n'est pas toujours très grand il faudra donc vérifier qu'il y ait suffisamment de place pour y mettre notre code.
  
 <file> <file>
Ligne 156: Ligne 173:
   0x019dc0 - 0x019acc  = 756 octets   0x019dc0 - 0x019acc  = 756 octets
 ====== Liens externes ====== ====== Liens externes ======
-  * [[http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html]] Understanding ELF using readelf and objdump +  * [[http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html|Understanding ELF using readelf and objdump]] 
-  * [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format]] +  * [[wp>Executable_and_Linkable_Format]]] 
-  * [[http://linux.die.net/man/5/elf]] man elf +  * [[http://linux.die.net/man/5/elf|man elf]] 
-  * [[http://www.eresi-project.org/]] The ERESI Reverse Engineering Software Interface +  * [[http://www.eresi-project.org/|The ERESI Reverse Engineering Software Interface]] 
-  * [[http://www.phrack.org/issues.html?issue=61&id=8#article]] The Cerberus ELF Interface +  * [[http://www.phrack.org/issues.html?issue=61&id=8#article|Phrack n°61 : The Cerberus ELF Interface]] 
-  * [[http://www.phrack.org/issues.html?issue=63&id=9#article]] Embedded ELF Debugging : the middle head of Cerberus+  * [[http://www.phrack.org/issues.html?issue=63&id=9#article|Phrack n°63 : Embedded ELF Debugging : the middle head of Cerberus]]
   * [[https://github.com/statl3r/squirt]]   * [[https://github.com/statl3r/squirt]]
injection_elf.1341601013.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)