Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 1036

Return-Oriented Programming

Revisado porCybersecurity entrepreneur & security researcher

¿Qué es Return-Oriented Programming?

Return-Oriented ProgrammingROP es una tecnica de explotacion por reutilizacion de codigo que encadena secuencias cortas terminadas en RET para ejecutar computacion arbitraria sin inyectar codigo nuevo.


Hovav Shacham introdujo el ROP en su artículo de 2007 "The Geometry of Innocent Flesh on the Bone", demostrando que el return-into-libc podía generalizarse hasta lograr computación Turing-completa y, con ello, derrotar DEP/W^X. El atacante corrompe la pila y escribe una cadena de direcciones, cada una apuntando a un gadget corto —unas pocas instrucciones que terminan en RET—. Tras ejecutarse cada gadget, RET extrae la siguiente dirección, de modo que el control fluye por bytes ejecutables ya existentes (libc, el programa, las bibliotecas) sin código inyectado que DEP pueda detectar.

Como cada dirección de gadget es absoluta, el ROP depende de saber dónde está el código en memoria, que es justo lo que ASLR aleatoriza; por eso los exploits reales lo combinan con una fuga de información. Las variantes generalizan la primitiva: JOP (saltos) y COP (llamadas) encadenan saltos/llamadas indirectas en lugar de retornos, y SROP (sigreturn) abusa de la restauración del marco de señal del kernel para fijar todos los registros de una vez. El Blind ROP (Bittau et al., 2014) construye una cadena contra un servicio remoto sin binario, observando los fallos.

El ROP es la razón principal de toda una generación de mitigaciones. Las defensas atacan una de tres superficies: disponibilidad de gadgets, integridad del flujo de control o seguridad de memoria en el origen. Intel CET (desde Tiger Lake, 2020) impone una shadow stack por hardware que detecta direcciones de retorno alteradas e Indirect Branch Tracking (endbr64) contra JOP/COP; ARM ofrece Pointer Authentication y BTI. Los lenguajes con memoria segura como Rust eliminan el error de corrupción que inicia la cadena.

flowchart TD
  A["Fallo de corrupcion de memoria<br/>desbordamiento de pila"] --> B["Sobrescribe direccion de retorno"]
  B --> C["La pila contiene ahora<br/>una cadena de gadgets"]
  C --> G1["Gadget 1: pop rdi, ret"]
  G1 --> G2["Gadget 2: pop rsi, ret"]
  G2 --> G3["Gadget 3: syscall, ret"]
  G3 --> X["execve /bin/sh"]
  D1["DEP: pila no ejecutable"] -. eludido por reutilizacion .-> C
  D2["ASLR"] -. requiere fuga de info .-> C
  D3["Shadow stack de Intel CET"] -. bloquea RET invalido .-> G1

Ejemplos

  1. 01

    Exploit que encadena gadgets pop-rdi/syscall de glibc para llamar a execve("/bin/sh").

  2. 02

    Exploit del kernel que usa una fuga de KASLR y ROP a commit_creds(prepare_kernel_cred(0)).

Preguntas frecuentes

¿Qué es Return-Oriented Programming?

ROP es una tecnica de explotacion por reutilizacion de codigo que encadena secuencias cortas terminadas en RET para ejecutar computacion arbitraria sin inyectar codigo nuevo. Pertenece a la categoría de Seguridad de aplicaciones en ciberseguridad.

¿Qué significa Return-Oriented Programming?

ROP es una tecnica de explotacion por reutilizacion de codigo que encadena secuencias cortas terminadas en RET para ejecutar computacion arbitraria sin inyectar codigo nuevo.

¿Cómo defenderse de Return-Oriented Programming?

Las defensas contra Return-Oriented Programming combinan habitualmente controles técnicos y prácticas operativas, como se detalla en la definición.

¿Cuáles son otros nombres para Return-Oriented Programming?

Nombres alternativos comunes: ROP, Ataque de reutilizacion de codigo, Return-to-libc.

Términos relacionados

Véase también