6 points par GN⁺ 2024-02-03 | 1 commentaires | Partager sur WhatsApp

Comment est structuré un binaire exécutable ? Explorons-le !

  • Un fichier exécutable n’est pas quelque chose d’incompréhensible : c’est un format de fichier standard.
  • L’article traite des binaires ELF sous Linux et utilise le langage C, mais cela s’applique aussi à d’autres langages compilés.
  • On y apprend ce que sont les symboles (symbols), les sections (sections) et les segments (segments).
  • Les symboles correspondent aux noms des fonctions, sont organisés dans des sections, et les sections composent les segments.
  • L’outil readelf est utilisé pour les examiner.

Étape 1 : l’ouvrir dans un éditeur de texte !

  • C’est la manière la plus simple de regarder un binaire, et on peut y repérer les textes « Penguin! » et « ELF ».

Étape 2 : afficher la table des symboles avec readelf

  • On peut afficher les symboles avec readelf --symbols.
  • On peut y voir des symboles comme main, puts et _start.
  • Le programme ne démarre pas à main, mais à _start.

Symboles

  • Lorsqu’on écrit un programme, des symboles sont générés pour les fonctions.
  • Quand on appelle une fonction provenant d’une bibliothèque, les symboles sont nécessaires pour retrouver le code de cette fonction.
  • L’édition de liens se fait via le lien statique (static linking) et le lien dynamique (dynamic linking).

Étape 3 : examiner le binaire avec objdump et découvrir les sections !

  • objdump offre un meilleur moyen d’examiner un binaire.
  • On peut voir des sections comme .text, .rodata et .interp.
  • Les sections sont utilisées au moment de l’édition de liens, tandis que les segments sont utilisés à l’exécution.

Étape 4 : afficher l’assembleur !

  • La section .text contient le code assembleur.
  • On peut afficher le code assembleur avec objdump -d.

Étape 5 : afficher les segments !

  • Un programme est composé de segments, ou d’en-têtes de programme.
  • On peut afficher les segments avec readelf --segments.
  • Les segments déterminent comment séparer en mémoire les différentes parties du programme.

Ce n’est pas de la magie !

  • Les fichiers exécutables ne relèvent pas de la magie, et ELF est un format de fichier comme les autres.
  • On peut examiner les binaires Linux avec readelf, nm et objdump.

Avis de GN⁺

  • Cet article est très utile aux ingénieurs logiciels débutants pour comprendre la structure des binaires exécutables.
  • Il fournit des informations pratiques sur les concepts de symboles, sections et segments, ainsi que sur les outils permettant de les examiner (readelf, objdump).
  • Il aide à acquérir une compréhension de base de la manière dont un programme est réellement chargé en mémoire et exécuté, ce qui peut éveiller l’intérêt pour la programmation système.

1 commentaires

 
GN⁺ 2024-02-03
Avis Hacker News
  • Un utilisateur recommande d’écrire soi-même un ELF (Executable and Linkable Format), en disant que cela aide énormément à comprendre les éléments de base d’un fichier exécutable. Il ajoute que cet article est utile pour ceux qui préfèrent une approche descendante plutôt que l’approche ascendante habituelle.

  • Un autre utilisateur explique qu’on peut penser qu’un programme commence à s’exécuter à main, mais qu’en réalité il démarre à _start. _start effectue plusieurs tâches importantes, notamment l’appel à main ; ce n’est pas spécifique au langage C, mais bien le point d’entrée du binaire, indépendamment du langage.

  • Un utilisateur mentionne que les articles de Julia sont toujours excellents et dit avoir obtenu de bons résultats en montrant aux gens, via une démonstration de la commande strings, que le code compilé ne garde pas de secrets.

  • Un utilisateur dit avoir étudié ce sujet pour la première fois lorsqu’il a réorienté sa carrière universitaire des mathématiques vers l’informatique, et ne l’avoir jamais regretté. Il note que Julia a elle aussi une formation en mathématiques, et pense que ce désir de raisonnement top-down a pu conduire les mathématiciens à ce type d’expérimentations.

  • Un utilisateur partage son expérience du moment où il a prouvé que des « fichiers exécutables réellement portables » pouvaient fonctionner sur diverses plateformes, en écho au fait que les exécutables sont spécifiques à chaque plateforme. Cela signifie que la solution au problème du cross-platform — que l’on a tenté de résoudre de multiples façons, avec Java, des bibliothèques cross-platform, etc. — était depuis longtemps sous nos yeux.

  • Un utilisateur raconte qu’au début des années 1990, il était fasciné par les formats des exécutables et a écrit en Modula 2 un visualiseur d’exécutables DOS et Windows. Ce programme, nommé VEXE, a été publié en shareware en 1991, a acquis un certain public parmi les crackers, et a même été mentionné dans le tutoriel +ORC.

  • Un utilisateur dit qu’afficher un fichier binaire dans le terminal est source de tristesse, et préfère utiliser hexdump -C à la place.

  • Plusieurs utilisateurs mentionnent qu’il s’agit d’un excellent fil de discussion sur ce sujet.

  • Un utilisateur recommande à ceux que le sujet intéresse de lire Cosmopolitan et RedBean, ainsi que « αcτµαlly pδrταblε εxεcµταblε (2020) ».