0Pricing
Cyber Security Academy · Lekcja

Programowanie zorientowane na zwroty (ROP)

Połączą Państwo gadżety ROP, aby obejść NX/DEP i tworzyć exploity niewymagające shellcode.

Programowanie zorientowane na zwroty (ROP) to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cyber Security Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.

Dlaczego istnieje ROP

Przy NX/DEP wstrzyknięty shellcode nie może zostać wykonany. Return-Oriented Programming (ROP) obchodzi to zabezpieczenie, łącząc krótkie, istniejące sekwencje kodu (gadżety) zakończone instrukcjami ret. Nie jest wstrzykiwany żaden nowy kod — używane są wyłącznie stos i istniejący kod.

Czym jest gadżet ROP

Gadżet to krótka sekwencja instrukcji zakończona ret, znaleziona w pliku binarnym lub załadowanych bibliotekach. Przykłady: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. Gadżety są elementami budulcowymi łańcuchów ROP.

Znajdowanie gadżetów

Narzędzia do znajdowania gadżetów ROP w plikach binarnych:

# 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"])

Budowanie łańcucha ROP

Łańcuch ROP to sekwencja adresów powrotu na stosie. Gdy wykonanie dojdzie do nadpisanego adresu powrotu, następuje skok do gadżetu 1 (który wykonuje użyteczną operację, a następnie wykonuje ret), który pobiera kolejny adres i skacze do gadżetu 2, i tak dalej.

ret2plt i nadpisywanie GOT

ret2plt wywołuje funkcje za pośrednictwem PLT (Procedure Linkage Table) — jest przydatne do wywołania puts() w celu ujawnienia adresów libc, a następnie użycia ich do wywołania system(). Struktury PLT/GOT są przewidywalne nawet przy włączonym ASLR dla głównego pliku binarnego (bez PIE).

Obejście ASLR za pomocą ROP

ROP może ujawnić adres funkcji libc z GOT za pomocą gadżetu wywołującego puts(GOT_entry). Ujawniony adres wskazuje bazę libc. Przesunięcie funkcji system() można obliczyć następująco: system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].

SROP: Sigreturn-Oriented Programming

SROP używa wywołania systemowego sigreturn do załadowania fałszywej ramki sigcontext, ustawiając wszystkie rejestry na wartości kontrolowane przez atakującego za pomocą jednego gadżetu. Jest przydatne, gdy dostępnych jest niewiele gadżetów.

Warianty JOP i COP

Poza ROP:

  • JOP (Jump-Oriented Programming) — łączy gadżety zakończone jmp zamiast ret
  • COP (Call-Oriented Programming) — łączy gadżety zakończone call

Zabezpieczenia takie jak CFI (Control Flow Integrity) mają zapobiegać wszystkim tym technikom.

Integralność przepływu sterowania (CFI)

CFI wymusza, aby pośrednie rozgałęzienia (wywołania i powroty) skakały wyłącznie do prawidłowych celów. Przerywa ROP, sprawdzając cel powrotu względem stosu cieniowego lub listy dozwolonych celów. Intel CET (Control-flow Enforcement Technology) implementuje CFI na poziomie sprzętowym.

Praktyczny przykład ROP

64-bitowy ret2libc za pośrednictwem 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()

Podsumowanie zabezpieczeń

Zabezpieczenia przeciwko ROP:

  • CFI — sprawdza cele rozgałęzień
  • Stos cieniowy (CET) — kopia adresu powrotu chroniona sprzętowo
  • RELRO (pełne) — ustawia GOT jako tylko do odczytu i zapobiega nadpisaniom
  • PIE — losuje bazę pliku binarnego, więc do znalezienia gadżetów wymagany jest wyciek

Szybki test: ROP

Czym jest gadżet ROP?

Podsumowanie lekcji

ROP obchodzi NX/DEP, łącząc istniejące sekwencje kodu (gadżety zakończone ret) — nie trzeba wstrzykiwać shellcode'u. Narzędzia do znajdowania gadżetów: ROPgadget, ropper. ret2plt ujawnia adresy libc, umożliwiając obejście ASLR. Zabezpieczenia: CFI, stosy cieniowe (Intel CET), PIE i pełne RELRO. ROP jest podstawą współczesnego wykorzystywania plików binarnych.

Często zadawane pytania

Czy lekcja „Programowanie zorientowane na zwroty (ROP)” jest bezpłatna?

Tak — pełny tekst „Programowanie zorientowane na zwroty (ROP)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cyber Security Academy, przejdź na CoddyKit PRO. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Programowanie zorientowane na zwroty (ROP)”?

Połączą Państwo gadżety ROP, aby obejść NX/DEP i tworzyć exploity niewymagające shellcode. Ćwiczysz Cyber Security Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cyber Security Academy?

Nie wymagamy żadnego doświadczenia. Cyber Security Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Programowanie zorientowane na zwroty (ROP)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cyber Security Academy?

Tak. Każda lekcja Cyber Security Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Przepełnienia bufora stosu
  2. Programowanie zorientowane na zwroty (ROP)
  3. Podatności format string
  4. Wykorzystanie sterty: use-after-free i heap spraying
← Powrót do Cyber Security Academy