Return-Oriented Programming (ROP)
Kedja ROP-gadgets för att kringgå NX/DEP och skapa exploits utan shellcode.
Return-Oriented Programming (ROP) är en gratis lektion i Cyber Security Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Cyber Security Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.
Varför ROP finns
Med NX/DEP kan injicerad shellcode inte köras. Return-Oriented Programming (ROP) kringgår detta genom att kedja ihop korta befintliga kodsekvenser (gadgetar) som avslutas med ret-instruktioner. Ingen ny kod injiceras — endast stacken och befintlig kod används.
Vad är en ROP-gadget?
En gadget är en kort instruktionssekvens som avslutas med ret och finns i binärfilen eller inlästa bibliotek. Exempel: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. Gadgetar är byggstenarna i ROP-kedjor.
Hitta gadgetar
Verktyg för att hitta ROP-gadgetar 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"])Bygga en ROP-kedja
En ROP-kedja är en sekvens av returadresser på stacken. När den överskrivna returadressen används hoppar programmet till gadget 1, som gör något användbart och sedan returnerar. Då hämtas nästa adress och programmet hoppar till gadget 2, och så vidare.
ret2plt och överskrivning av GOT
ret2plt anropar funktioner via PLT (Procedure Linkage Table) — användbart för att anropa puts() och läcka libc-adresser, som sedan kan användas för att anropa system(). PLT/GOT-strukturerna är förutsägbara även med ASLR för huvudbinärfilen (utan PIE).
Kringgå ASLR med ROP
ROP kan läcka adressen till en libc-funktion från GOT med hjälp av en gadget som anropar puts(GOT_entry). Den läckta adressen avslöjar libc:s basadress. Beräkna offseten för system(): system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].
SROP: Sigreturn-Oriented Programming
SROP använder systemanropet sigreturn för att läsa in en falsk sigcontext-ram och ställa in alla register till värden som angriparen kontrollerar, med hjälp av en enda gadget. Användbart när det finns få gadgetar tillgängliga.
JOP- och COP-varianter
Utöver ROP:
- JOP (Jump-Oriented Programming) — kedjar gadgetar som avslutas med
jmpi stället förret - COP (Call-Oriented Programming) — kedjar gadgetar som avslutas med
call
Försvar som CFI (Control Flow Integrity) syftar till att förhindra alla dessa tekniker.
Kontrollflödesintegritet (CFI)
CFI säkerställer att indirekta hopp (anrop och returer) endast går till giltiga mål. Det bryter ROP genom att validera returmålet mot en shadow stack eller en tillåtelselista. Intel CET (Control-flow Enforcement Technology) implementerar CFI på hårdvarunivå.
Praktiskt ROP-exempel
En 64-bitars 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()Sammanfattning av begränsningar
Skydd mot ROP:
- CFI — validerar grenmål
- Shadow stack (CET) — hårdvaruskyddad kopia av returadressen
- RELRO (full) — gör GOT skrivskyddad och förhindrar överskrivningar
- PIE — randomiserar binärfilens basadress, vilket kräver en läcka för att hitta gadgetar
Snabbkontroll: ROP
Vad är en ROP-gadget?
Sammanfattning av lektionen
ROP kringgår NX/DEP genom att kedja ihop befintliga kodsekvenser (gadgetar som avslutas med ret) — ingen shellcode behöver injiceras. Verktyg för att hitta gadgetar: ROPgadget, ropper. ret2plt läcker libc-adresser för att kringgå ASLR. Försvar: CFI, shadow stacks (Intel CET), PIE och full RELRO. ROP är grunden för modern binär exploatering.
Lär dig Cyber Security Academy med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 76
- Lektioner
- 303
Vanliga frågor
Är lektionen ”Return-Oriented Programming (ROP)” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Cyber Security Academy, inklusive ”Return-Oriented Programming (ROP)”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Return-Oriented Programming (ROP)”?
Kedja ROP-gadgets för att kringgå NX/DEP och skapa exploits utan shellcode. Ni övar på Cyber Security Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Cyber Security Academy?
Du behöver inga förkunskaper. Utbildningen i Cyber Security Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Return-Oriented Programming (ROP)”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Cyber Security Academy-lektionen?
Ja. Varje Cyber Security Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Stackbaserade buffertöverflöden
- Return-Oriented Programming (ROP)
- Sårbarheter i formatsträngar
- Heapexploatering: use-after-free och heap spraying