Przepełnienia bufora stosu
Poznają Państwo układ stosu, nadpisywanie EIP/RIP i napiszą działający exploit dla podatnego programu binarnego w C.
Przepełnienia bufora stosu to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 1 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.
Czym jest przepełnienie bufora?
Przepełnienie bufora występuje, gdy do bufora zostanie zapisanych więcej danych, niż może on pomieścić. Nadmiarowe dane nadpisują sąsiadujące obszary pamięci, potencjalnie uszkadzając struktury sterujące i przekierowując wykonanie programu.
Układ pamięci stosu
Stos wywołań zawiera: zmienne lokalne (bufory), zapisany wskaźnik ramki (SFP) oraz adres powrotu (RIP/EIP) — miejsce, w którym wykonanie jest kontynuowane po powrocie z funkcji. Przepełnienie lokalnego bufora może nadpisać adres powrotu.
Klasyczne przepełnienie stosu
Jeśli program wywołuje gets() lub strcpy() bez sprawdzania długości, atakujący może wprowadzić wystarczająco dużo bajtów, aby wypełnić bufor i nadpisać adres powrotu adresem shellcode'u lub użytecznego gadżetu.
// Vulnerable C code:
void vuln() {
char buf[64];
gets(buf); // No bounds checking!
}Ustalanie przesunięcia
Należy ustalić, ile bajtów dociera do adresu powrotu, korzystając z generowania wzorca:
# Generate a cyclic pattern:
python3 -c "from pwn import *; print(cyclic(200))" | ./vuln
# After crash, find offset:
python3 -c "from pwn import *; print(cyclic_find(0x61616166))"Zabezpieczenia: canary stosu
Canary stosu to losowa wartość umieszczona między zmiennymi lokalnymi a zapisanym adresem powrotu. Przed powrotem z funkcji canary jest sprawdzany — jeśli został nadpisany, program zostaje zakończony. W przypadku klasycznego wykorzystania przepełnienia należy ominąć to zabezpieczenie.
Zabezpieczenia: ASLR
Address Space Layout Randomization (ASLR) losuje adres bazowy stosu, sterty i bibliotek przy każdym uruchomieniu. Bez wycieku aktualnego adresu odgadnięcie miejsca skoku jest niewykonalne w systemach 64-bitowych.
Zabezpieczenia: NX/DEP
NX (No-Execute) / DEP (Data Execution Prevention) oznacza stos jako niewykonywalny. Shellcode wstrzyknięty do bufora nie może zostać wykonany bezpośrednio. Wymusza to użycie przez atakujących programowania zorientowanego na powroty (Return-Oriented Programming, ROP).
Wycieki adresów
Aby obejść ASLR, atakujący potrzebują wycieku informacji: podatności format string, odczytów poza zakresem sterty (takich jak Heartbleed) lub możliwego do odczytania wskaźnika w wykorzystywanej funkcji. Jeden wyciek adresu ujawnia przesunięcie i pozwala obliczyć pozostałe adresy.
Pisanie podstawowego exploita
Podstawowe 32-bitowe przepełnienie stosu bez zabezpieczeń:
# Python exploit skeleton (pwntools):
from pwn import *
p = process("./vuln")
offset = 76
shellcode = asm(shellcraft.sh())
payload = shellcode + b"A" * (offset - len(shellcode)) + p32(stack_addr)
p.sendline(payload)
p.interactive()Technika ret2libc
ret2libc obchodzi NX, wykonując powrót do funkcji libc (takich jak system()) zamiast używać shellcode'u. Atakujący nadpisuje adres powrotu adresem funkcji system i przekazuje "/bin/sh" jako argument.
Narzędzia do tworzenia exploitów
Niezbędne narzędzia:
- pwntools — biblioteka Pythona do tworzenia exploitów
- GDB + pwndbg/peda — debugger z pomocniczymi funkcjami do exploitów
- checksec — wyświetla zabezpieczenia pliku binarnego
- ROPgadget / ropper — wyszukują łańcuchy ROP
checksec --file=./vulnSzybki test: przepełnienie stosu
Które zabezpieczenie umieszcza losową wartość między zmiennymi lokalnymi a zapisanym adresem powrotu i kończy program, jeśli ta wartość zostanie nadpisana?
Podsumowanie lekcji
Przepełnienia bufora stosu nadpisują adres powrotu przez zapisanie danych poza granicami bufora. Zabezpieczenia obejmują canary stosu (wykrywa nadpisania), ASLR (losuje adresy) oraz NX/DEP (oznacza stos jako niewykonywalny). ret2libc obchodzi NX. Wycieki informacji pozwalają obejść ASLR. pwntools upraszcza tworzenie exploitów.
Często zadawane pytania
Czy lekcja „Przepełnienia bufora stosu” jest bezpłatna?
Tak — pełny tekst „Przepełnienia bufora stosu” 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 „Przepełnienia bufora stosu”?
Poznają Państwo układ stosu, nadpisywanie EIP/RIP i napiszą działający exploit dla podatnego programu binarnego w C. Ć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 1 z 4.
Ile czasu zajmuje lekcja „Przepełnienia bufora stosu”?
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
- Przepełnienia bufora stosu
- Programowanie zorientowane na zwroty (ROP)
- Podatności format string
- Wykorzystanie sterty: use-after-free i heap spraying