Return-Oriented Programming (ROP)
Kæd ROP-gadgets for at omgå NX/DEP, og byg exploits uden shellcode.
Return-Oriented Programming (ROP) er en gratis Cyber Security Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Cyber Security Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Cyber Security Academy-kurset indeholder 4 lektioner i alt.
Hvorfor ROP findes
Med NX/DEP kan injiceret shellcode ikke eksekveres. Returorienteret programmering (ROP) omgår dette ved at kæde små eksisterende kodesekvenser (gadgets), der slutter med ret-instruktioner. Der injiceres ingen ny kode — kun stakken og eksisterende kode bruges.
Hvad er en ROP-gadget?
En gadget er en kort sekvens af instruktioner, der slutter med ret, og som findes i binærfilen eller indlæste biblioteker. Eksempler: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. Gadgets er byggestenene i ROP-kæder.
Sådan finder du gadgets
Værktøjer til at finde ROP-gadgets i binærfiler:
# 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"])Opbygning af en ROP-kæde
En ROP-kæde er en sekvens af returadresser på stakken. Når den overskrevne returadresse rammes, hopper den til gadget 1 (som udfører noget nyttigt og derefter returnerer), som henter den næste adresse og hopper til gadget 2, og så videre.
ret2plt og GOT-overskrivning
ret2plt kalder funktioner via PLT (procedurekoblingstabellen) — nyttigt til at kalde puts() for at lække libc-adresser og derefter bruge dem til at kalde system(). PLT/GOT-strukturerne er forudsigelige selv med ASLR for hovedbinærfilen (uden PIE).
Omgåelse af ASLR med ROP
ROP kan lække adressen på en libc-funktion fra GOT ved hjælp af en gadget, der kalder puts(GOT_entry). Den lækkede adresse afslører libc-basisen. Beregn forskydningen til system(): system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].
SROP: sigreturn-orienteret programmering
SROP bruger sigreturn-systemkaldet til at indlæse en falsk sigcontext-ramme, som indstiller alle registre til angriberstyrede værdier i én gadget. Det er nyttigt, når der kun er få gadgets til rådighed.
JOP- og COP-varianter
Ud over ROP:
- JOP (jump-orienteret programmering) — kæder gadgets, der slutter med
jmpi stedet forret - COP (call-orienteret programmering) — kæder gadgets, der slutter med
call
Forsvar som CFI (integritet af kontrolflow) sigter mod at forhindre dem alle.
Integritet af kontrolflow (CFI)
CFI håndhæver, at indirekte forgreninger (kald, returneringer) kun hopper til gyldige mål. Det bryder ROP ved at validere returmålet mod en skyggestak eller en tilladelsesliste. Intel CET (teknologi til håndhævelse af kontrolflow) implementerer CFI på hardwareniveau.
Praktisk ROP-eksempel
Et 64-bit-ret2libc via 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()Oversigt over beskyttelser
Beskyttelser mod ROP:
- CFI — validerer forgreningsmål
- Skyggestak (CET) — hardwarebeskyttet kopi af returadressen
- RELRO (fuld) — gør GOT skrivebeskyttet og forhindrer overskrivninger
- PIE — randomiserer binærfilens basis og kræver en lækage for at finde gadgets
Hurtigt tjek: ROP
Hvad er en ROP-gadget?
Opsummering af lektionen
ROP omgår NX/DEP ved at kæde eksisterende kodesekvenser (gadgets, der slutter med ret) — ingen shellcode-injektion er nødvendig. Værktøjer til at finde gadgets: ROPgadget, ropper. ret2plt lækker libc-adresser for at omgå ASLR. Beskyttelser: CFI, skyggestakke (Intel CET), PIE, fuld RELRO. ROP er grundlaget for moderne binærudnyttelse.
Lær Cyber Security Academy med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 303
Ofte stillede spørgsmål
Er lektionen “Return-Oriented Programming (ROP)” gratis?
Ja — alle 3 lektioner i læringssporet Cyber Security Academy, inklusive “Return-Oriented Programming (ROP)”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Cyber Security Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Return-Oriented Programming (ROP)”?
Kæd ROP-gadgets for at omgå NX/DEP, og byg exploits uden shellcode. Du øver dig i Cyber Security Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Cyber Security Academy?
Der kræves ingen tidligere erfaring. Cyber Security Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Return-Oriented Programming (ROP)”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Cyber Security Academy-lektion?
Ja. Alle Cyber Security Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Stack buffer overflows
- Return-Oriented Programming (ROP)
- Sårbarheder i formatstrenge
- Heap-exploitering: Use-After-Free og heap spraying