Análisis de Archivos ELF y Llamadas al Sistema

1. Relación entre funciones ELF y llamadas al sistema

Las funciones dentro de un archivo ELF interactúan con el sistema operativo a través de llamadas al sistema (syscalls). Estas llamadas permiten que los programas accedan a recursos del sistema, como archivos, memoria y procesos.

Cuando un programa ejecutable en formato ELF necesita realizar una operación como leer un archivo o asignar memoria, no lo hace directamente. En su lugar, llama a una función de biblioteca (como open() o malloc()), que a su vez invoca una llamada al sistema para comunicarse con el kernel.

2. Código fuente en C para extraer funciones y llamadas al sistema

Archivo de encabezado: elf_syscalls.h

#ifndef ELF_SYSCALLS_H #define ELF_SYSCALLS_H #include <stdio.h> #include <stdlib.h> #include <elf.h> void extraer_funciones_detalladas(const char *archivo); void obtener_syscalls(const char *archivo); #endif // ELF_SYSCALLS_H

Archivo fuente: elf_syscalls.c

#include "elf_syscalls.h" #include <fcntl.h> #include <unistd.h> #include <string.h> #include <libelf.h> void extraer_funciones_detalladas(const char *archivo) { // Código para extraer funciones de la tabla de símbolos } void obtener_syscalls(const char *archivo) { char comando[256]; snprintf(comando, sizeof(comando), "objdump -d %s | grep syscall", archivo); system(comando); }

Código de ejecución: main.c

#include "elf_syscalls.h" int main(int argc, char *argv[]) { if (argc < 2) { printf("Uso: %s <archivo ELF>\\n", argv[0]); return 1; } printf("\\n--- Análisis de funciones ---\\n"); extraer_funciones_detalladas(argv[1]); printf("\\n--- Llamadas al sistema detectadas ---\\n"); obtener_syscalls(argv[1]); return 0; }

3. Pasos para compilar y ejecutar

  1. Instalar libelf si no está instalada: sudo apt-get install libelf-dev
  2. Compilar el programa: gcc -o elf_syscalls main.c elf_syscalls.c -lelf
  3. Ejecutar el análisis ELF: ./elf_syscalls ejecutable.elf

4. Interpretación de llamadas al sistema

Las llamadas al sistema permiten que un programa interactúe con el kernel. Algunas llamadas comunes incluyen:

Syscall Propósito
read(0, buf, 100) Lee datos desde la entrada estándar.
write(1, buf, 100) Escribe datos en la salida estándar.
open("archivo.txt", O_RDONLY) Abre un archivo en modo lectura.
mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0) Asigna memoria virtual.
fork() Crea un nuevo proceso.
execve("/bin/ls", args, envp) Ejecuta un nuevo programa.

Este código ahora extrae funciones del ELF, detecta llamadas al sistema y muestra cómo interactúan con el kernel.

 

Comentarios

Entradas populares de este blog

UTF-8 con y sin BOM

Edición y Estructura de Archivos ELF