Ret2win
Podstawowe informacje
Ret2win to popularna kategoria wyzwań w Capture The Flag (CTF), szczególnie w zadaniach związanych z binary exploitation. Celem jest wykorzystanie luki w danym binarnym pliku, aby wykonać określoną, niewywołaną funkcję w tym pliku, często nazywaną win
, flag
itp. Ta funkcja, po wykonaniu, zazwyczaj wyświetla flagę lub komunikat o sukcesie. Wyzwanie zazwyczaj polega na nadpisaniu adresu powrotu na stosie, aby przekierować przepływ wykonania do pożądanej funkcji. Oto bardziej szczegółowe wyjaśnienie z przykładami:
Przykład w C
Rozważmy prosty program w C z luką i funkcją win
, którą zamierzamy wywołać:
Aby skompilować ten program bez ochrony stosu i z wyłączonym ASLR, możesz użyć następującego polecenia:
-m32
: Kompiluj program jako 32-bitowy plik binarny (to jest opcjonalne, ale powszechne w wyzwaniach CTF).-fno-stack-protector
: Wyłącz ochronę przed przepełnieniem stosu.-z execstack
: Zezwól na wykonywanie kodu na stosie.-no-pie
: Wyłącz Position Independent Executable, aby upewnić się, że adres funkcjiwin
się nie zmienia.-o vulnerable
: Nazwij plik wyjściowyvulnerable
.
Python Exploit używając Pwntools
Do exploitacji użyjemy pwntools, potężnego frameworka CTF do pisania exploitów. Skrypt exploitowy 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, które pozwala na inspekcję plików binarnych. Na przykład, z objdump
możesz użyć:
To polecenie pokaże Ci asembler funkcji win
, w tym jej adres początkowy.
Skrypt Pythona wysyła starannie skonstruowaną wiadomość, która, gdy jest przetwarzana przez vulnerable_function
, przepełnia bufor i nadpisuje adres powrotu na stosie adresem win
. Gdy vulnerable_function
zwraca, zamiast wracać do main
lub kończyć, skacze do win
, a wiadomość jest drukowana.
Ochrony
PIE powinno być wyłączone, aby adres był wiarygodny w różnych wykonaniach, w przeciwnym razie adres, w którym funkcja będzie przechowywana, nie zawsze będzie taki sam i potrzebowałbyś jakiegoś leaku, aby dowiedzieć się, gdzie załadowana jest funkcja win. W niektórych przypadkach, gdy funkcja, która powoduje przepełnienie, to
read
lub podobna, możesz wykonać Częściowe Nadpisanie 1 lub 2 bajtów, aby zmienić adres powrotu na funkcję win. Z powodu działania ASLR, ostatnie trzy heksadecymalne nibble nie są losowe, więc istnieje 1/16 szansy (1 nibble), aby uzyskać poprawny adres powrotu.Stack Canaries również powinny być wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nigdy nie będzie śledzony.
Inne przykłady i odniesienia
32 bity, bez ASLR
64 bity z ASLR, z leakiem adresu bin
64 bity, bez ASLR
32 bity, bez ASLR, podwójne małe przepełnienie, pierwsze przepełnia stos i zwiększa rozmiar drugiego przepełnienia
32 bity, relro, bez canary, nx, bez pie, format string do nadpisania adresu
fflush
funkcją win (ret2win)32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) do wywołania funkcji win
32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) do wywołania funkcji win
Program tylko waliduje ostatni bajt liczby, aby sprawdzić rozmiar wejścia, dlatego możliwe jest dodanie dowolnego rozmiaru, o ile ostatni bajt mieści się w dozwolonym zakresie. Następnie wejście tworzy przepełnienie bufora wykorzystane z ret2win.
64 bity, relro, bez canary, nx, pie. Częściowe nadpisanie, aby wywołać funkcję win (ret2win)
arm64, PIE, daje 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
Ret2win - arm64Last updated