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
- Instalar
libelfsi no está instalada:sudo apt-get install libelf-dev - Compilar el programa:
gcc -o elf_syscalls main.c elf_syscalls.c -lelf - 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
Publicar un comentario