Kontrolowanie EIP
Nadpisywanie adresu powrotu
Kontrolowanie EIP to bezpłatna lekcja Ethical Hacking Academy na CoddyKit. To lekcja 3 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.
Cel
Znają już Państwo przesunięcie, więc mogą umieścić dowolne cztery bajty w EIP. Pozostaje pytanie: jaki adres należy tam wstawić?
Celem jest ustawienie EIP tak, aby wskazywał shellcode. Nie można jednak po prostu wpisać na stałe adresu stosu — potrzebny jest niezawodny skok.
Dlaczego nie wpisać na stałe adresu stosu
Adres stosu, pod którym znajduje się shellcode, może zmieniać się między uruchomieniami i systemami. Nawet niewielkie zmiany środowiska mogą go przesunąć.
Zamiast tego należy użyć stabilnej instrukcji znajdującej się już w pamięci, która przekieruje wykonanie tam, gdzie aktualnie wskazuje ESP.
Sztuczka JMP ESP
Jeśli w chwili awarii ESP wskazuje shellcode, można ustawić EIP na adres instrukcji JMP ESP. Po załadowaniu tego adresu do EIP procesor wykona jmp esp i przejdzie do shellcode.
Takie pośrednie przekierowanie zwiększa niezawodność exploita niezależnie od dokładnego adresu stosu.
jmp esp ; opcode FF E4Znajdowanie JMP ESP
Należy przeszukać załadowane moduły (najlepiej takie bez ASLR) pod kątem bajtów kodu maszynowego FF E4. Adres bazowy modułu pozostaje stały, dzięki czemu ten gadżet jest niezawodny.
Narzędzia takie jak mona.py automatycznie znajdują odpowiednie instrukcje.
!mona jmp -r esp -cpb "\x00"Unikanie niedozwolonych znaków
Niektóre wartości bajtów uszkadzają dane wejściowe, zanim dotrą one do bufora w niezmienionej postaci. Klasycznym przykładem jest bajt null 0x00, który kończy łańcuchy C. Inne przykłady to 0x0a (znak nowej linii) i 0x0d (powrót karetki).
Adres JMP ESP nie może zawierać żadnego z tych niedozwolonych znaków.
Identyfikowanie niedozwolonych znaków
Aby ustalić, które bajty są niedozwolone, należy wysłać do bufora wszystkie wartości bajtów z zakresu 0x00-0xff, a następnie obejrzeć pamięć w debuggerze. Bajty, które zostały zmienione lub zniknęły, są niedozwolonymi znakami.
Należy wykluczyć je zarówno z adresu powrotu, jak i z shellcode.
!mona bytearray -cpb "\x00"Budowanie nadpisania EIP
Teraz należy złożyć dane wejściowe: dopełnienie do przesunięcia, a następnie adres JMP ESP w kolejności little-endian.
Jeśli JMP ESP znajduje się pod adresem 0x625011AF, zapisywane bajty będą odwrócone.
buf = "A"*offset + "\xaf\x11\x50\x62" # 0x625011AF, little-endianWeryfikowanie skoku
Należy ustawić punkt przerwania na adresie JMP ESP w debuggerze i uruchomić exploit. Gdy EIP dotrze pod ten adres i wykona skok przez ESP, będzie to potwierdzenie niezawodnego przekierowania.
W tym momencie EIP wskazuje miejsce, w którym znajdzie się shellcode.
Robienie miejsca na shellcode
Za adresem powrotu pozostała część bufora (na którą wskazuje ESP) zawiera shellcode. Jeśli miejsca jest mało, może być potrzebny krótki skok lub przeniesienie kodu.
Ślizg NOP (ciąg bajtów 0x90 oznaczających brak operacji, 0x90) przed shellcode zwiększa tolerancję, dzięki czemu skok może trafić w dowolne miejsce tego ciągu.
buf = "A"*offset + ret + "\x90"*16 + shellcodeSkładanie całości
Pełna struktura exploita jest już jasna:
- Dopełnienie do przesunięcia.
- Adres JMP ESP (bez niedozwolonych znaków, w kolejności little-endian).
- Ślizg NOP.
- Shellcode.
Do uruchomienia powłoki pozostał już tylko jeden krok.
Alternatywy dla JMP ESP
JMP ESP to klasyczny sposób przekierowania, ale nie jedyny. Jeśli inny rejestr wskazuje bufor, można użyć jmp eax, call esp lub gadżetu push esp; ret.
Zasada pozostaje taka sama: należy znaleźć stabilną instrukcję, która przekaże sterowanie w miejsce, gdzie znajduje się shellcode.
Szybkie sprawdzenie
Proszę przypomnieć sobie, dlaczego JMP ESP jest preferowane zamiast wpisanego na stałe adresu stosu.
Podsumowanie
Mają już Państwo kontrolę nad przebiegiem wykonania:
- Należy nadpisać EIP adresem gadżetu JMP ESP zamiast zawodnym adresem stosu.
- Gadżetu należy szukać w module bez ASLR, unikając niedozwolonych znaków, takich jak
0x00. - Adres należy zapisać w kolejności little-endian i dodać ślizg NOP przed shellcode.
W następnym kroku wygenerują Państwo shellcode i uruchomią powłokę.
Często zadawane pytania
Czy lekcja „Kontrolowanie EIP” jest bezpłatna?
Tak — pełny tekst „Kontrolowanie EIP” 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 „Kontrolowanie EIP”?
Nadpisywanie adresu powrotu Ć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 3 z 4.
Ile czasu zajmuje lekcja „Kontrolowanie EIP”?
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.
Wszystkie lekcje w tym kursie
- Pamięć i stos
- Fuzzing w poszukiwaniu awarii
- Kontrolowanie EIP
- Shellcode i eksploatacja