Edición y Estructura de Archivos ELF
Este código hexadecimal representa la cabecera de un archivo ELF (Executable and Linkable Format), que es un formato de archivo ejecutable utilizado en sistemas operativos como Linux y Unix.
7f45 4c46 0201 0100 0000 0000 0000 0000 0300 3e00 0100 0000 8011 0000 0000 0000 4000 0000 0000 0000 2839 0000 0000 0000 0000 0000 4000 3800 0d00 4000 1f00 1e00 0600 0000 0400 0000 4000 0000 0000 0000 4000 0000 0000 0000 4000 0000 0000 0000 d802 0000 0000 0000 d802 0000 0000 0000 0800 0000 0000 0000 0300 0000 0400 0000 1803 0000 0000 0000 1803 0000 0000 0000 1803 0000 0000 0000 1c00 0000 0000 0000 1c00 0000 0000 0000 0100 0000 0000 0000 0100 0000 0400 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 a008 0000 0000 0000 a008 0000 0000 0000 0010 0000 0000 0000 0100 0000 0500 0000 0010 0000 0000 0000 0010 0000 0000 0000 0010 0000 0000 0000 cd07 0000 0000 0000 cd07 0000 0000 0000 0010 0000 0000 0000 0100 0000 0400 0000 0020 0000 0000 0000 0020 0000 0000 0000 0020 0000 0000 0000 8404 0000 0000 0000 8404 0000 0000 0000 0010 0000 0000 0000 0100 0000 0600 0000
Interpretación del código
Cada línea de este código hexadecimal corresponde a una parte específica de la cabecera ELF. Aquí tienes una interpretación detallada:
| Código Hexadecimal | Interpretación |
|---|---|
7f45 4c46 |
Identificador ELF (0x7F 'E' 'L' 'F'). |
0201 |
Indica que es un archivo ELF de 64 bits. |
0100 |
Especifica el endianess (little-endian). |
0000 0000 0000 0000 |
Reservado. |
0300 |
Tipo de archivo (Ejecutable). |
3e00 |
Arquitectura (x86-64). |
0100 0000 |
Versión ELF. |
8011 0000 0000 0000 |
Dirección de entrada del programa. |
4000 0000 0000 0000 |
Offset de la tabla de programas. |
2839 0000 0000 0000 |
Offset de la tabla de secciones. |
0000 0000 4000 3800 |
Tamaño de la cabecera ELF. |
0d00 4000 1f00 1e00 |
Tamaño de las entradas de la tabla de programas y secciones. |
Formato del archivo
Este código está escrito en hexadecimal, que es la representación binaria de los datos almacenados en un archivo ELF. Los archivos ELF contienen información sobre cómo un programa debe ejecutarse en un sistema basado en Linux
Si deseas analizar más detalles sobre este archivo ELF, puedes usar herramientas como:
readelf -h archivo→ Muestra la cabecera ELF.objdump -x archivo→ Desensambla el código.xxd archivo→ Muestra el contenido en hexadecimal.
1. ¿Se puede editar un archivo ELF?
- ✅ Sí, pero con precaución.
-
✅ Se pueden modificar usando herramientas como
hexedit,objdump,readelforadare2. - ✅ Se pueden parchear valores específicos, cambiar secciones o modificar el código ensamblador.
- ❌ Modificar incorrectamente un ELF puede corromperlo, haciendo que no sea ejecutable.
2. Nomenclatura, sintaxis y semántica de ELF
📌 Nomenclatura de ELF
.text→ Contiene el código ejecutable..data→ Contiene datos inicializados..bss→ Contiene datos no inicializados..rodata→ Contiene datos de solo lectura.-
.plt→ Tabla de enlace de procedimientos (para llamadas a funciones externas).
📌 Sintaxis de ELF
- ELF usa una estructura binaria con cabeceras organizadas en hexadecimal.
-
Se pueden interpretar con
readelf -h archivo.elfpara ver su estructura.
📌 Semántica de ELF
- Cada sección tiene un propósito específico en la ejecución del programa.
- La cabecera ELF define cómo el sistema operativo debe cargar el archivo en memoria.
3. ¿Por qué al eliminar ceros se corrompe el ELF?
- ✅ Los ceros pueden ser datos de alineación o punteros importantes.
- ❌ Eliminar ceros puede romper la estructura del ELF, causando errores de ejecución.
- ✅ Los ceros pueden representar espacios reservados en la memoria, eliminarlos puede hacer que el programa no se cargue correctamente.
- ✅ Algunas secciones deben tener un tamaño exacto, si se modifican, el sistema no podrá interpretar el archivo correctamente.
4. Herramientas para editar archivos ELF
| Herramienta | Propósito |
|---|---|
hexedit |
Editor hexadecimal para modificar valores binarios. |
readelf |
Muestra la estructura del ELF. |
objdump |
Desensambla el código del ELF. |
radare2 |
Herramienta avanzada para análisis y modificación de binarios. |
Si necesitas modificar un ELF, hazlo con cuidado y usa herramientas adecuadas para evitar corrupción del archivo.
Extracción de Secciones ELF
1. ¿Qué hace este código?
Este código analiza un archivo ELF y extrae información sobre sus secciones, incluyendo:
.text→ Contiene el código ejecutable..data→ Contiene datos inicializados..bss→ Contiene datos no inicializados..rodata→ Contiene datos de solo lectura..plt→ Tabla de enlace de procedimientos (para llamadas a funciones externas).
2. Código fuente en C
Archivo de encabezado: elf_sections.h
#ifndef ELF_SECTIONS_H
#define ELF_SECTIONS_H
#include <stdio.h>
#include <stdlib.h>
#include <elf.h>
void extraer_secciones_elf(const char *archivo);
#endif // ELF_SECTIONS_H
Archivo fuente: elf_sections.c
#include "elf_sections.h"
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <libelf.h>
void extraer_secciones_elf(const char *archivo) {
int fd = open(archivo, O_RDONLY);
if (fd < 0) {
perror("Error al abrir el archivo ELF");
return;
}
if (elf_version(EV_CURRENT) == EV_NONE) {
fprintf(stderr, "Error: versión ELF no soportada.\\n");
close(fd);
return;
}
Elf *elf = elf_begin(fd, ELF_C_READ, NULL);
if (!elf) {
fprintf(stderr, "Error al leer el archivo ELF.\\n");
close(fd);
return;
}
Elf64_Shdr *shdr;
Elf_Scn *scn = NULL;
size_t shstrndx;
if (elf_getshdrstrndx(elf, &shstrndx) != 0) {
fprintf(stderr, "Error al obtener índice de nombres de secciones.\\n");
elf_end(elf);
close(fd);
return;
}
printf("\\n--- Secciones ELF encontradas ---\\n");
while ((scn = elf_nextscn(elf, scn)) != NULL) {
shdr = elf64_getshdr(scn);
const char *nombre_seccion = elf_strptr(elf, shstrndx, shdr->sh_name);
if (nombre_seccion) {
if (strcmp(nombre_seccion, ".text") == 0 ||
strcmp(nombre_seccion, ".data") == 0 ||
strcmp(nombre_seccion, ".bss") == 0 ||
strcmp(nombre_seccion, ".rodata") == 0 ||
strcmp(nombre_seccion, ".plt") == 0) {
printf("Sección: %s\\n", nombre_seccion);
printf("Dirección en memoria: 0x%lx\\n", shdr->sh_addr);
printf("Tamaño: %lu bytes\\n", shdr->sh_size);
printf("Tipo de sección: %u\\n", shdr->sh_type);
printf("-----------------------------------\\n");
}
}
}
elf_end(elf);
close(fd);
}
Código de ejecución: main.c
#include "elf_sections.h"
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Uso: %s <archivo ELF>\\n", argv[0]);
return 1;
}
extraer_secciones_elf(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_sections main.c elf_sections.c -lelf - Ejecutar el análisis ELF:
./elf_sections ejecutable.elf
4. Interpretación de las secciones ELF
| Sección | Propósito |
|---|---|
.text |
Contiene el código ejecutable del programa. |
.data |
Contiene datos inicializados. |
.bss |
Contiene datos no inicializados. |
.rodata |
Contiene datos de solo lectura. |
.plt |
Tabla de enlace de procedimientos (para llamadas a funciones externas). |
Este código ahora extrae información detallada de las secciones ELF, mostrando nombres, direcciones, tamaños y tipos.

Comentarios
Publicar un comentario