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

Return-Oriented Programming

Revisado porCybersecurity entrepreneur & security researcher

O que é Return-Oriented Programming?

Return-Oriented ProgrammingROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo.


Hovav Shacham introduziu o ROP no artigo de 2007 "The Geometry of Innocent Flesh on the Bone", mostrando que o return-into-libc podia ser generalizado até uma computação Turing-completa e, assim, derrotar DEP/W^X. O atacante corrompe a pilha e escreve uma cadeia de endereços, cada um apontando para um gadget curto — poucas instruções terminadas em RET. Após cada gadget executar, RET retira o endereço seguinte, de modo que o controlo flui por bytes executáveis já existentes (libc, o programa, as bibliotecas), sem código injetado que o DEP possa apanhar.

Como cada endereço de gadget é absoluto, o ROP depende de saber onde o código está em memória — exatamente o que o ASLR aleatoriza; por isso os exploits reais combinam-no com uma fuga de informação. As variantes generalizam a primitiva: JOP (saltos) e COP (chamadas) encadeiam saltos/chamadas indiretas em vez de retornos, e SROP (sigreturn) abusa da restauração do frame de sinal do kernel para definir todos os registos de uma vez. O Blind ROP (Bittau et al., 2014) constrói uma cadeia contra um serviço remoto sem binário, observando os crashes.

O ROP é a principal razão de toda uma geração de mitigações. As defesas atacam uma de três superfícies: disponibilidade de gadgets, integridade do fluxo de controlo ou segurança de memória na origem. O Intel CET (desde Tiger Lake, 2020) impõe uma shadow stack por hardware que deteta endereços de retorno alterados e Indirect Branch Tracking (endbr64) contra JOP/COP; a ARM oferece Pointer Authentication e BTI. Linguagens de memória segura como Rust eliminam o erro de corrupção que inicia a cadeia.

flowchart TD
  A["Erro de corrupcao de memoria<br/>estouro de pilha"] --> B["Sobrescreve endereco de retorno"]
  B --> C["A pilha contem agora<br/>uma cadeia 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: pilha nao executavel"] -. contornado por reuso .-> C
  D2["ASLR"] -. exige fuga de info .-> C
  D3["Shadow stack do Intel CET"] -. bloqueia RET invalido .-> G1

Exemplos

  1. 01

    Exploit encadeia gadgets pop-rdi/syscall da glibc para chamar execve("/bin/sh").

  2. 02

    Exploit de kernel combina fuga de KASLR e ROP para commit_creds(prepare_kernel_cred(0)).

Perguntas frequentes

O que é Return-Oriented Programming?

ROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo. Pertence à categoria Segurança de aplicações da cibersegurança.

O que significa Return-Oriented Programming?

ROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo.

Como se defender contra Return-Oriented Programming?

As defesas contra Return-Oriented Programming costumam combinar controles técnicos e práticas operacionais, conforme detalhado na definição acima.

Quais são outros nomes para Return-Oriented Programming?

Nomes alternativos comuns: ROP, Ataque de reuso de codigo, Return-to-libc.

Termos relacionados

Ver também