Ret2win
Podstawowe informacje
Wyzwania Ret2win są popularną kategorią w konkursach Capture The Flag (CTF), szczególnie w zadaniach związanych z eksploatacją binarną. Celem jest wykorzystanie podatności w danym pliku binarnym do wykonania określonej, niezawołanej funkcji wewnątrz binarnego pliku, często nazwanej np. win
, flag
, itp. Ta funkcja, gdy jest wywoływana, zazwyczaj wyświetla flagę lub komunikat o sukcesie. Wyzwanie zazwyczaj polega na nadpisaniu adresu powrotu na stosie, aby zmienić przepływ wykonania na pożądaną funkcję. Oto bardziej szczegółowe wyjaśnienie wraz z przykładami:
Przykład w języku C
Rozważ prosty program w języku C z podatnością i funkcją win
, którą zamierzamy wywołać:
Aby skompilować ten program bez zabezpieczeń stosu i z wyłączonym ASLR, można użyć poniższej komendy:
-m32
: Skompiluj program jako 32-bitowy binarny (to jest opcjonalne, ale częste w wyzwaniach CTF).-fno-stack-protector
: Wyłącz zabezpieczenia przed przepełnieniem stosu.-z execstack
: Pozwól na wykonanie kodu ze stosu.-no-pie
: Wyłącz wykonywalny plik o pozycji niezależnej, aby zapewnić, że adres funkcjiwin
nie zmieni się.-o vulnerable
: Nazwij plik wyjściowyvulnerable
.
Wykorzystanie exploitu w Pythonie za pomocą Pwntools
Do eksploatacji użyjemy pwntools, potężnego frameworka CTF do pisania exploitów. Skrypt exploitu stworzy ładunek, aby przepełnić bufor i nadpisać adres powrotu adresem funkcji win
.
Aby znaleźć adres funkcji win
, możesz użyć gdb, objdump lub innego narzędzia umożliwiającego inspekcję plików binarnych. hNa przykład, z objdump
, możesz użyć:
To polecenie pokaże ci zestawienie funkcji win
, wraz z jej adresem początkowym.
Skrypt w języku Python wysyła starannie spreparowaną wiadomość, która po przetworzeniu przez funkcję vulnerable_function
powoduje przepełnienie bufora i nadpisanie adresu powrotu na stosie adresem win
. Gdy funkcja vulnerable_function
zakończy działanie, zamiast wracać do main
lub zakończyć, skacze do funkcji win
, a wiadomość zostaje wyświetlona.
Zabezpieczenia
PIE powinno być wyłączone aby adres był niezawodny w kolejnych wykonaniach, w przeciwnym razie adres, pod którym będzie przechowywana funkcja, nie będzie zawsze taki sam i będzie potrzebny jakiś wyciek, aby ustalić, gdzie jest załadowana funkcja
win
. W niektórych przypadkach, gdy funkcja powodująca przepełnienie toread
lub podobna, można dokonać Częściowego Nadpisania 1 lub 2 bajtami, aby zmienić adres powrotu na funkcjęwin
. Ze względu na działanie ASLR, ostatnie trzy heksadecymalne cyfry nie są losowo generowane, więc istnieje 1/16 szansa (1 cyfra) na uzyskanie poprawnego adresu powrotu.Canary na Stosie powinno być również wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nigdy nie zostanie wykonany.
Inne przykłady i Odnośniki
32 bity, brak ASLR
64 bity z ASLR, z wyciekiem adresu binarnego
64 bity, brak ASLR
32 bity, brak ASLR, podwójne małe przepełnienie, najpierw przepełnienie stosu i zwiększenie rozmiaru drugiego przepełnienia
32 bity, relro, brak canary, nx, brak pie, łańcuch formatujący do nadpisania adresu
fflush
funkcją win (ret2win)32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) w celu wywołania funkcji win
32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) w celu wywołania funkcji win
Program sprawdza tylko ostatni bajt liczby, aby sprawdzić rozmiar wejścia, dlatego można dodać dowolny rozmiar, o ile ostatni bajt mieści się w dozwolonym zakresie. Następnie wejście powoduje przepełnienie bufora wykorzystane z ret2win.
64 bity, relro, brak canary, nx, pie. Częściowe nadpisanie w celu wywołania funkcji win (ret2win)
arm64, PIE, ujawnia wyciek PIE, funkcja win to tak naprawdę 2 funkcje, więc gadżet ROP, który wywołuje 2 funkcje
ARM64, off-by-one do wywołania funkcji win
Przykład ARM64
Last updated