Programación orientada al retorno (ROP)
Encadene gadgets ROP para eludir NX/DEP y crear exploits sin shellcode.
Programación orientada al retorno (ROP) es una lección gratuita de Cyber Security Academy en CoddyKit. Esta es la lección 2 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.
Por qué existe ROP
Con NX/DEP, el shellcode inyectado no puede ejecutarse. La programación orientada a retornos (ROP) evade esta protección al encadenar pequeñas secuencias de código existentes (gadgets) que terminan con instrucciones ret. No se inyecta código nuevo: solo se utilizan la pila y el código existente.
¿Qué es un gadget de ROP?
Un gadget es una secuencia corta de instrucciones que termina en ret y se encuentra en el binario o en las bibliotecas cargadas. Algunos ejemplos son: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. Los gadgets son los componentes básicos de las cadenas ROP.
Búsqueda de gadgets
Herramientas para buscar gadgets ROP en binarios:
# ROPgadget:
ROPgadget --binary ./vuln --rop
# ropper:
ropper -f ./vuln --search "pop rdi"
# pwntools:
from pwn import *
elf = ELF("./vuln")
rop = ROP(elf)
rop.find_gadget(["pop rdi", "ret"])Construcción de una cadena ROP
Una cadena ROP es una secuencia de direcciones de retorno en la pila. Cuando se alcanza la dirección de retorno sobrescrita, se salta al gadget 1 (que hace algo útil y luego hace ret), que extrae la siguiente dirección y salta al gadget 2, y así sucesivamente.
ret2plt y sobrescritura de GOT
ret2plt llama a funciones mediante la PLT (tabla de enlace de procedimientos), lo que resulta útil para llamar a puts() y filtrar direcciones de libc, y después utilizarlas para llamar a system(). Las estructuras PLT/GOT son predecibles incluso con ASLR para el binario principal (sin PIE).
Evasión de ASLR con ROP
ROP puede filtrar la dirección de una función de libc desde la GOT mediante un gadget que llama a puts(GOT_entry). La dirección filtrada revela la base de libc. Calcule el desplazamiento de system(): system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].
SROP: programación orientada a sigreturn
SROP utiliza la llamada al sistema sigreturn para cargar un marco sigcontext falso y establecer todos los registros con valores controlados por el atacante en un solo gadget. Resulta útil cuando hay pocos gadgets disponibles.
Variantes JOP y COP
Más allá de ROP:
- JOP (Jump-Oriented Programming) — encadena gadgets que terminan en
jmpen lugar deret - COP (Call-Oriented Programming) — encadena gadgets que terminan en
call
Las defensas como CFI (integridad del flujo de control) pretenden impedir todas estas técnicas.
Integridad del flujo de control (CFI)
CFI impone que las ramas indirectas (llamadas y retornos) solo salten a destinos válidos. Rompe ROP al validar el destino de retorno mediante una pila espejo o una lista de permitidos. Intel CET (tecnología de aplicación del flujo de control) implementa CFI a nivel de hardware.
Ejemplo práctico de ROP
Un ret2libc de 64 bits mediante ROP:
# pwntools ROP chain example:
from pwn import *
p = process("./vuln")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./vuln")
rop = ROP(elf)
# Leak puts GOT to get libc base
rop.puts(elf.got["puts"])
rop.main()Resumen de mitigaciones
Protecciones contra ROP:
- CFI — valida los destinos de las ramas
- Pila espejo (CET) — copia de la dirección de retorno protegida por hardware
- RELRO (completo) — hace que la GOT sea de solo lectura y evita sobrescrituras
- PIE — aleatoriza la base del binario y requiere una filtración para encontrar gadgets
Comprobación rápida: ROP
¿Qué es un gadget de ROP?
Resumen de la lección
ROP evade NX/DEP al encadenar secuencias de código existentes (gadgets que terminan en ret); no es necesario inyectar shellcode. Herramientas para encontrar gadgets: ROPgadget y ropper. ret2plt filtra direcciones de libc para evadir ASLR. Defensas: CFI, pilas espejo (Intel CET), PIE y RELRO completo. ROP es la base de la explotación moderna de binarios.
Preguntas frecuentes
¿La lección «Programación orientada al retorno (ROP)» es gratis?
Sí — el texto completo de «Programación orientada al retorno (ROP)» 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 «Programación orientada al retorno (ROP)»?
Encadene gadgets ROP para eludir NX/DEP y crear exploits sin shellcode. 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 2 de 4.
¿Cuánto tiempo toma la lección «Programación orientada al retorno (ROP)»?
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
- Desbordamientos de búfer en la pila
- Programación orientada al retorno (ROP)
- Vulnerabilidades de cadenas de formato
- Explotación del heap: Use-After-Free y heap spraying