Cyber Security Academy · Lección

Fundamentos de reversing y pwn

Introducción a la ingeniería inversa y la explotación de binarios.

Lección 3 de 413 pasos

Fundamentos de reversing y pwn es una lección gratuita de Cyber Security Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cyber Security Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cyber Security Academy incluye 4 lecciones en total.

Reversing y pwn de un vistazo

Dos categorías de CTF estrechamente relacionadas trabajan con programas compilados:

  • Ingeniería inversa (rev) — analiza un binario para comprender qué hace, a menudo con el fin de recuperar una comprobación de contraseña o una lógica oculta que imprime la flag.
  • Pwn (explotación de binarios) — encuentra un fallo de seguridad de memoria en un binario en ejecución y lo explota para secuestrar el flujo de ejecución, con frecuencia para abrir un shell en un servicio remoto que contiene la flag.

Rev trata de comprender; pwn, de romper. Ambas requieren familiaridad con conceptos de bajo nivel.

Primera inspección de un binario

Nunca abra un binario a ciegas en un desensamblador. Haga primero un triaje con herramientas rápidas de línea de comandos para conocer su tipo, arquitectura y cualquier cadena de texto evidente.

# Identify file type and architecture
file ./challenge

# Pull human-readable strings (flags are sometimes left in plaintext)
strings ./challenge

# Check which security mitigations are enabled
checksec --file=./challenge

Análisis estático frente a dinámico

Analiza los binarios de dos formas complementarias:

  • Análisis estático — lea el código sin ejecutarlo, mediante un desensamblador o un decompilador como Ghidra, o mediante una vista del desensamblador. Verá todo el flujo de control, pero tendrá que inferir los valores en tiempo de ejecución.
  • Análisis dinámico — ejecute el programa con un depurador como GDB y observe los valores reales de los registros y la memoria. Verá exactamente lo que ocurre, pero solo a lo largo de la ruta que ejecute.

Los jugadores experimentados alternan entre ambos: leen estáticamente para formular una teoría y la confirman dinámicamente avanzando paso a paso.

Lectura del desensamblado

Para hacer reversing, debe leer ensamblador. No necesita escribirlo con fluidez, pero sí reconocer ciertos patrones:

  • cmp / test seguido de un salto (je, jne) indica una comparación y una bifurcación; a menudo, es la comprobación de la contraseña.
  • call invoca una función; los argumentos se han colocado en registros o en la pila justo antes.
  • mov mueve datos entre registros, memoria y constantes.

Cuando encuentre un cmp contra su entrada seguido de una bifurcación hacia un mensaje de éxito, habrá encontrado la comprobación. Ahora debe recuperar o eludir el valor esperado.

Los decompiladores le permiten avanzar más rápido

Los decompiladores modernos convierten el ensamblador en un C aproximado, mucho más rápido de leer que las instrucciones sin procesar. Una comprobación de contraseña decompilada podría tener este aspecto:

// Decompiler output (approximate)
if (strcmp(user_input, "s3cr3t_p4ss") == 0) {
    puts("Correct! Here is your flag:");
    print_flag();
} else {
    puts("Wrong.");
}

Cómo comienza la corrupción de memoria

Los retos de pwn explotan programas que leen la entrada en un búfer de tamaño fijo sin comprobar su longitud. La pila almacena las variables locales y la dirección de retorno guardada que indica a la CPU adónde debe ir cuando termina una función.

Si la entrada desborda un búfer local, puede sobrescribir esa dirección de retorno guardada. Quien controle la dirección de retorno controla adónde se dirigirá la ejecución a continuación.

// Vulnerable: no bound on how much is read into buf
void vuln() {
    char buf[64];
    gets(buf);   // reads until newline, ignores buf size
}

El desbordamiento clásico de búfer en la pila

El pwn más sencillo consiste en sobrescribir la dirección de retorno para saltar a una función que el programa nunca pretendía llamar: una función oculta win() que imprime la flag.

Los pasos son:

  • Encuentre el offset exacto desde el inicio del búfer hasta la dirección de retorno; una herramienta de patrones cíclicos lo proporciona rápidamente.
  • Encuentre la dirección de la función objetivo.
  • Envíe relleno hasta el offset y sobrescriba después la dirección de retorno con la dirección del objetivo.
# Build the input with a Python exploit library
from pwn import *

p = process('./challenge')
offset = 72                 # bytes to reach the return address
win_addr = 0x401176        # address of the win() function
p.sendline(b'A' * offset + p64(win_addr))
p.interactive()

Mitigaciones modernas

Los binarios reales activan defensas que bloquean los desbordamientos ingenuos. Debe identificarlas con checksec:

  • Canarios de pila — un valor secreto colocado antes de la dirección de retorno; si cambia, el programa se aborta. Primero debe filtrarlo.
  • NX (No-eXecute) — la pila no es ejecutable, por lo que no puede ejecutar shellcode colocado allí.
  • ASLR / PIE — las direcciones se aleatorizan en cada ejecución, por lo que necesita filtrar una dirección antes de poder apuntar.
  • RELRO — protege la tabla de desplazamientos globales frente a sobrescrituras.

Cada mitigación le orienta hacia técnicas más avanzadas.

Programación orientada a retornos (ROP)

Cuando NX le impide ejecutar su propio código, la programación orientada a retornos reutiliza código que ya existe en el binario.

Encadena pequeñas secuencias de instrucciones llamadas gadgets, cada una terminada en ret, para realizar acciones paso a paso; por ejemplo, cargar un registro y llamar a una función de biblioteca para abrir un shell. Construye la cadena en la pila para que cada ret salte al gadget siguiente.

ROP es el puente entre los desbordamientos para principiantes y la explotación real, donde el código del atacante rara vez se puede ejecutar directamente.

Vulnerabilidades de cadenas de formato

Otra primitiva clásica de pwn es la vulnerabilidad de cadena de formato, que aparece cuando la entrada del usuario se pasa directamente como argumento de formato a una función de impresión.

// Vulnerable: user controls the format string
printf(user_input);          // dangerous

// Safe: user input is data, not format
printf("%s", user_input);    // correct

Por qué los defensores aprenden esto

Aprende a explotar fallos de memoria con precisión precisamente para poder prevenirlos. Las conclusiones defensivas son concretas:

  • No use nunca funciones de entrada sin límites como gets o strcpy; utilice equivalentes que comprueben la longitud.
  • Mantenga activadas las mitigaciones: canarios, NX, ASLR/PIE completo y RELRO completo de forma predeterminada.
  • Prefiera lenguajes seguros para la memoria cuando el modelo de amenazas lo permita.
  • Considere un hallazgo grave en la revisión de código cualquier valor controlado por el usuario que llegue a una cadena de formato o a una copia de búfer.

Comprobación rápida

Compruebe su comprensión de los fundamentos de reversing y pwn.

Repaso

Ahora tiene un mapa del reversing y pwn:

  • Haga un triaje de cada binario con file, strings y checksec antes de realizar un análisis profundo.
  • Combine el análisis estático (desensamblador/decompilador) y dinámico (depurador) para comprender la lógica.
  • El pwn comienza con el desbordamiento de un búfer en la pila que sobrescribe una dirección de retorno; las mitigaciones (canarios, NX, ASLR/PIE, RELRO) elevan la dificultad.
  • La ROP vence a NX reutilizando gadgets existentes; los fallos de cadena de formato surgen de argumentos de formato que no son de confianza.
  • Cada técnica también constituye una lección defensiva para escribir y revisar código más seguro.

A continuación, creará un kit de herramientas y aprenderá a redactar informes de sus soluciones.

Gratis para empezar

Aprende Cyber Security Academy con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
76
Lecciones
303

Preguntas frecuentes

¿La lección «Fundamentos de reversing y pwn» es gratis?

Sí — el texto completo de «Fundamentos de reversing y pwn» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cyber Security Academy, actualiza a CoddyKit PRO. El curso de Cyber Security Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Fundamentos de reversing y pwn»?

Introducción a la ingeniería inversa y la explotación de binarios. Practicas Cyber Security Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Cyber Security Academy?

No se requiere experiencia previa. Cyber Security Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Fundamentos de reversing y pwn»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Cyber Security Academy?

Sí. Cada lección de Cyber Security Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Categorías y mentalidad de los CTF
  2. Retos web y de criptografía
  3. Fundamentos de reversing y pwn
  4. Herramientas y writeups
← Volver a Cyber Security Academy