6 puntos por GN⁺ 2024-02-03 | 1 comentarios | Compartir por WhatsApp

¿Cómo está compuesto un archivo ejecutable binario? ¡Vamos a explorarlo!

  • Un archivo ejecutable no es algo incomprensible, sino un formato de archivo regular.
  • Se trabaja con binarios ELF en Linux y se usa el lenguaje C, aunque también aplica a otros lenguajes compilados.
  • Se aprende sobre símbolos (symbols), secciones (sections) y segmentos (segments).
  • Los símbolos son como nombres de funciones, se organizan en secciones, y las secciones forman segmentos.
  • Se usa la herramienta readelf para examinarlos.

Paso 1: ¡Abrirlo en un editor de texto!

  • Es la forma más simple de ver un binario, y se pueden encontrar los textos "Penguin!" y "ELF".

Paso 2: Ver la tabla de símbolos con readelf

  • Se pueden ver los símbolos con readelf --symbols.
  • Se pueden identificar símbolos como main, puts y _start.
  • El programa no comienza en main, sino en _start.

Símbolos

  • Al escribir un programa, se generan símbolos para las funciones.
  • Cuando se llama una función desde una biblioteca, se necesitan símbolos para encontrar el código de esa función.
  • El enlazado se realiza mediante enlazado estático (static linking) y enlazado dinámico (dynamic linking).

Paso 3: ¡Ver el binario con objdump y aprender sobre secciones!

  • objdump ofrece una mejor manera de ver el binario.
  • Se pueden ver secciones como .text, .rodata y .interp.
  • Las secciones se usan en tiempo de enlazado, y los segmentos en tiempo de ejecución.

Paso 4: ¡Ver ensamblador!

  • La sección .text contiene código ensamblador.
  • Se puede ver el código ensamblador con objdump -d.

Paso 5: ¡Ver segmentos!

  • El programa está compuesto por segmentos o encabezados de programa.
  • Se pueden ver los segmentos con readelf --segments.
  • Los segmentos determinan cómo separar en memoria las distintas partes del programa.

¡No es magia!

  • Un archivo ejecutable no es magia, y ELF es como cualquier otro formato de archivo.
  • Se puede investigar un binario de Linux con readelf, nm y objdump.

Opinión de GN⁺

  • Este artículo es muy útil para ingenieros de software principiantes que quieren entender la estructura de los archivos ejecutables binarios.
  • Ofrece información práctica sobre los conceptos de símbolos, secciones y segmentos, así como sobre las herramientas para examinarlos (readelf, objdump).
  • También ayuda a construir una comprensión básica de cómo un programa realmente se carga en memoria y se ejecuta, lo que puede despertar interés por la programación de sistemas.

1 comentarios

 
GN⁺ 2024-02-03
Comentarios de Hacker News
  • Un usuario recomienda escribir directamente un ELF (Executable and Linkable Format), ya que ayuda mucho a entender las partes básicas de un archivo ejecutable. Además, comenta que este artículo es útil para quienes quieren un enfoque de arriba hacia abajo en lugar del enfoque tradicional de abajo hacia arriba.

  • Otro usuario explica que uno podría pensar que un programa empieza a ejecutarse en main, pero en realidad comienza en _start. _start realiza varias tareas importantes, como llamar a main, y no es algo específico del lenguaje C, sino el punto de entrada de un binario independientemente del lenguaje.

  • Un usuario menciona que los artículos de Julia siempre son excelentes y que obtuvo buenos resultados al enseñar a la gente que el código compilado no guarda secretos, haciendo una demostración del comando strings.

  • Un usuario dice que estudió este tema por primera vez cuando cambió su trayectoria académica de matemáticas a ciencias de la computación, y que nunca se arrepintió de profundizar de esa manera. También señala que Julia tiene formación en matemáticas y piensa que ese deseo de razonar de arriba hacia abajo pudo haber llevado a los matemáticos a este tipo de experimentos.

  • Un usuario reflexiona sobre el hecho de que los archivos ejecutables son específicos de cada plataforma y comparte su experiencia al demostrar que un “ejecutable realmente portable” podía correr en distintas plataformas. Eso implica que la solución al problema multiplataforma —que se intentó resolver de muchas maneras, como Java o las bibliotecas multiplataforma— había estado frente a nuestros ojos durante mucho tiempo.

  • Un usuario cuenta que a inicios de los 90 quedó fascinado por los formatos de ejecutables y escribió un visor de ejecutables de DOS y Windows en Modula 2. El programa se publicó como shareware en 1991 con el nombre VEXE, consiguió cierto seguimiento entre crackers y hasta fue mencionado en tutoriales de +ORC.

  • Un usuario dice que imprimir un archivo binario en la terminal es fuente de tristeza, y que por eso prefiere usar hexdump -C.

  • Varios usuarios mencionan que este es un excelente hilo sobre el tema.

  • Un usuario recomienda a quienes estén interesados en este tema leer sobre Cosmopolitan y RedBean, así como “αcτµαlly pδrταblε εxεcµταblε (2020)”.