Return-Oriented Programming (ROP)
Collegate gadget ROP per aggirare NX/DEP e costruire exploit senza shellcode.
Return-Oriented Programming (ROP) è una lezione Cyber Security Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cyber Security Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cyber Security Academy include 4 lezioni in totale.
Perché esiste ROP
Con NX/DEP, la shellcode iniettata non può essere eseguita. Il Return-Oriented Programming (ROP) elude questa protezione concatenando piccole sequenze di codice esistenti (gadget) che terminano con istruzioni ret. Non viene iniettato nuovo codice: vengono usati solo lo stack e il codice esistente.
Che cos'è un gadget ROP?
Un gadget è una breve sequenza di istruzioni che termina con ret, presente nel binario o nelle librerie caricate. Esempi: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. I gadget sono gli elementi costitutivi delle catene ROP.
Trovare i gadget
Strumenti per trovare gadget ROP nei binari:
# 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"])Costruire una catena ROP
Una catena ROP è una sequenza di indirizzi di ritorno nello stack. Quando viene raggiunto l'indirizzo di ritorno sovrascritto, il flusso passa al gadget 1 (che esegue un'operazione utile e poi ritorna), che estrae l'indirizzo successivo e passa al gadget 2, e così via.
ret2plt e sovrascrittura della GOT
ret2plt chiama le funzioni tramite la PLT (Procedure Linkage Table), utile per chiamare puts() e fare trapelare gli indirizzi di libc, quindi usarli per chiamare system(). Le strutture PLT/GOT sono prevedibili anche con ASLR per il binario principale (senza PIE).
Eludere ASLR con ROP
ROP può fare trapelare l'indirizzo di una funzione di libc dalla GOT usando un gadget che chiama puts(GOT_entry). L'indirizzo trapelato rivela la base di libc. Calcolare l'offset di system(): system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].
SROP: Sigreturn-Oriented Programming
SROP usa la syscall sigreturn per caricare un frame sigcontext falso, impostando tutti i registri su valori controllati dall'attaccante con un solo gadget. È utile quando sono disponibili pochi gadget.
Varianti JOP e COP
Oltre a ROP:
- JOP (Jump-Oriented Programming) — concatena gadget che terminano con
jmpinvece diret - COP (Call-Oriented Programming) — concatena gadget che terminano con
call
Le difese come CFI (Control Flow Integrity) mirano a impedire tutte queste tecniche.
Integrità del flusso di controllo (CFI)
CFI impone che i branch indiretti (chiamate e ritorni) saltino solo a destinazioni valide. Interrompe ROP verificando la destinazione del ritorno rispetto a uno shadow stack o a una allowlist. Intel CET (Control-flow Enforcement Technology) implementa la CFI a livello hardware.
Esempio pratico di ROP
Un ret2libc a 64 bit tramite 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()Riepilogo delle mitigazioni
Protezioni contro ROP:
- CFI — verifica le destinazioni dei branch
- Shadow stack (CET) — copia dell'indirizzo di ritorno protetta dall'hardware
- RELRO (full) — rende la GOT di sola lettura e impedisce le sovrascritture
- PIE — randomizza la base del binario e richiede un leak per trovare i gadget
Verifica rapida: ROP
Che cos'è un gadget ROP?
Riepilogo della lezione
ROP elude NX/DEP concatenando sequenze di codice esistenti (gadget che terminano con ret): non è necessario iniettare shellcode. Strumenti per trovare i gadget: ROPgadget, ropper. ret2plt fa trapelare gli indirizzi di libc per eludere ASLR. Difese: CFI, shadow stack (Intel CET), PIE, RELRO completo. ROP è alla base del moderno sfruttamento dei binari.
Domande Frequenti
La lezione «Return-Oriented Programming (ROP)» è gratuita?
Sì — il testo completo di «Return-Oriented Programming (ROP)» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cyber Security Academy, passa a CoddyKit PRO. Il corso Cyber Security Academy include 4 lezioni in totale.
Cosa imparerò in «Return-Oriented Programming (ROP)»?
Collegate gadget ROP per aggirare NX/DEP e costruire exploit senza shellcode. Eserciti Cyber Security Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cyber Security Academy?
Non è richiesta alcuna esperienza precedente. Cyber Security Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Return-Oriented Programming (ROP)»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cyber Security Academy?
Sì. Ogni lezione Cyber Security Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Buffer overflow nello stack
- Return-Oriented Programming (ROP)
- Vulnerabilità di format string
- Sfruttamento dell'heap: use-after-free e heap spraying