Lab 10x - Entry point de un ELF
Una vez el loader ha transferido las diversas secciones de un ejecutable a memoria, este debe transferir control al código del ejecutable.
Una de las informaciones que contiene el header de un archivo ejecutable es el entry point address, i.e. la dirección de la primera instrucción que debe ejecutarse.
Contrario a lo que uno podría pensar, las instrucciones donde comienza la ejecución de un programa NO son las de la función main
.
Resulta que el linker graba dentro del ejecutable una o más funciones que son invocadas previo a main
y entry point address es la dirección de una de easa funciones.
El siguiente ejercicio sirve para ilustrar el concepto de entry point address.
Paso 1
Crea un programa sencillo en lenguage C, como el siguiente:
#include <stdio.h>
int main(int argc, char *argv) {
printf("Hello");
return argc + 0x7777;
}
Compilalo para una x86 (32-bits) usando un comando como el siguiente:
gcc -m32 -o example example.c
Paso 2
Ejecuta el comando file example
para determinar el tipo de ejecutable que acabamos de crear. Vas a obtener información como la siguiente:
example: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Algunos datos importantes:
* ELF 32-bit: el formato del ejectuable es ELF 32-bit
* Intel 80386: El código de máquina es para la arquitectura Intel 80386
* dynamically linked (uses shared libs): Usa librerías dinamicamente enlazadas (a diferencia de usar librerías estáticamente enlazas)
* not stripped: El ejectuable contiene tabla de símbolos pues no le hemos corrido el programa strip
para borrar la tabla (más tarde lo haremos).
Paso 3
Corre readelf -all example | more
para observar algunas informaciones importantes en el encabezado del archivo. Observa el valor de Entry point address