Pamięć i stos
Jak działają przepełnienia
Pamięć i stos to bezpłatna lekcja Ethical Hacking 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 Ethical Hacking Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ethical Hacking Academy zawiera 4 lekcji w sumie.
Układ pamięci procesu
Gdy program działa, system operacyjny przydziela mu układ pamięci z wyraźnie wydzielonymi obszarami: text (kod), data/BSS (zmienne globalne), heap (alokacja dynamiczna) oraz stack.
Przepełnienia bufora najczęściej wykorzystują stos, dlatego jego zrozumienie jest niezbędne.
Czym jest stos?
Stos to obszar pamięci używany podczas wywołań funkcji. Przechowuje zmienne lokalne, argumenty funkcji i adresy powrotu.
Na platformie x86 rośnie w dół: umieszczanie danych na stosie przesuwa wskaźnik stosu w kierunku niższych adresów. Ten kierunek ma znaczenie, gdy dochodzi do przepełnienia.
Ramki stosu
Każde wywołanie funkcji tworzy ramkę stosu. Ramka zazwyczaj zawiera zmienne lokalne, zapisany wskaźnik bazowy (EBP) oraz adres powrotu (zapisany EIP).
Adres powrotu wskazuje procesorowi, gdzie wznowić wykonywanie po zakończeniu funkcji. Przejęcie nad nim kontroli jest sednem wykorzystywania przepełnienia stosu.
Najważniejsze rejestry
W 32-bitowym x86 najważniejsze rejestry to:
- ESP: wskaźnik stosu, wskazuje szczyt stosu.
- EBP: wskaźnik bazowy, stanowi punkt odniesienia dla bieżącej ramki.
- EIP: wskaźnik instrukcji, zawiera adres następnej instrukcji.
Jeśli ma się kontrolę nad EIP, ma się kontrolę nad przepływem wykonywania.
Czym jest bufor?
Bufor to blok pamięci o stałym rozmiarze, na przykład lokalna tablica znaków. Program oczekuje, że dane zmieszczą się w jego obrębie.
Jeśli program kopiuje więcej danych, niż może pomieścić bufor, bez sprawdzenia długości, nadmiar przelewa się do sąsiedniego obszaru pamięci.
char buffer[64];
strcpy(buffer, user_input); // no bounds checkPrzepełnienie bufora
Przepełnienie bufora występuje, gdy dane wejściowe przekraczają rozmiar bufora i nadpisują sąsiednie dane na stosie.
Ponieważ zapisany EBP i adres powrotu znajdują się tuż za lokalnymi buforami, odpowiednio duże dane wejściowe mogą nadpisać adres powrotu, przejmując kontrolę nad przebiegiem wykonania.
Niebezpieczne funkcje
Przepełnienia zwykle wynikają z użycia niebezpiecznych funkcji języka C, które nie sprawdzają długości:
strcpy,strcat,sprintf,gets.
Bezpieczniejsze alternatywy, takie jak strncpy czy snprintf, przyjmują limit rozmiaru, ale starszy kod jest pełen tych niebezpiecznych funkcji.
gets(buffer); // never use: no length limit at allCo daje nadpisanie EIP
Gdy podatna funkcja kończy działanie, procesor pobiera adres powrotu (obecnie kontrolowany przez atakującego) do EIP i wykonuje skok pod ten adres.
Jeśli wskażą Państwo w EIP własny wstrzyknięty kod maszynowy (shellcode), procesor wykona go z uprawnieniami programu.
Adresowanie little-endian
Architektura x86 jest zgodna z konwencją little-endian: wartości wielobajtowe są przechowywane od najmniej znaczącego bajtu. Aby nadpisać adres powrotu wartością 0x080414C3, należy zapisać bajty w odwrotnej kolejności.
Pomylenie kolejności bajtów to częsty błąd początkujących, który powoduje ciche niepowodzenie exploitów.
address 0x080414C3 -> bytes \xc3\x14\x04\x08Współczesne mechanizmy ochrony
Współczesne systemy stosują mechanizmy ochrony, które utrudniają wykorzystanie podatności:
- DEP/NX: oznacza stos jako niewykonywalny.
- ASLR: losowo zmienia adresy w pamięci.
- Canary stosu: wykrywa nadpisania przed powrotem z funkcji.
Ten kurs koncentruje się na klasycznym przypadku (przy wyłączonych zabezpieczeniach), aby nauczyć Państwa podstaw.
Dlaczego to nadal ma znaczenie
Choć współczesne mechanizmy ochrony utrudniają klasyczne przepełnienia stosu, podstawy nadal są niezbędne. Systemy wbudowane, urządzenia IoT i starsze oprogramowanie często w ogóle nie mają tych zabezpieczeń.
Opanowanie podstawowego przypadku jest również warunkiem stosowania zaawansowanych technik, takich jak ROP, które omijają współczesne mechanizmy ochrony.
Szybkie sprawdzenie
Proszę przypomnieć sobie, nad jaką wartością atakujący chce ostatecznie przejąć kontrolę.
Podsumowanie
Znają już Państwo podstawy:
- Stos przechowuje zmienne lokalne, zapisany EBP i adres powrotu, a rośnie w dół.
- ESP, EBP, EIP to najważniejsze rejestry x86; kontrolowanie EIP oznacza kontrolowanie wykonania.
- Niebezpieczne funkcje, takie jak
strcpyigets, powodują przepełnienia. - Architektura x86 jest zgodna z konwencją little-endian; współczesne zabezpieczenia to DEP, ASLR i canary.
W następnym kroku przeprowadzą Państwo fuzzing programu, aby znaleźć przesunięcie powodujące awarię.
Często zadawane pytania
Czy lekcja „Pamięć i stos” jest bezpłatna?
Tak — pełny tekst „Pamięć i stos” 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 Ethical Hacking Academy, przejdź na CoddyKit PRO. Kurs Ethical Hacking Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pamięć i stos”?
Jak działają przepełnienia Ćwiczysz Ethical Hacking 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ąć Ethical Hacking Academy?
Nie wymagamy żadnego doświadczenia. Ethical Hacking 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 „Pamięć i stos”?
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 Ethical Hacking Academy?
Tak. Każda lekcja Ethical Hacking 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.