SROP - Sigreturn-Oriented Programming
Podstawowe informacje
Sigreturn
to specjalne wywołanie systemowe (syscall), które głównie służy do posprzątania po zakończeniu działania obsługi sygnału. Sygnały to przerwania wysyłane do programu przez system operacyjny, często w celu wskazania, że wystąpiła jakaś wyjątkowa sytuacja. Gdy program otrzymuje sygnał, tymczasowo wstrzymuje swoją bieżącą pracę, aby obsłużyć sygnał za pomocą obsługi sygnału - specjalnej funkcji przeznaczonej do radzenia sobie z sygnałami.
Po zakończeniu obsługi sygnału program musi wznowić swój poprzedni stan, jakby nic się nie stało. W tym miejscu pojawia się sigreturn
. Pomaga on programowi powrócić z obsługi sygnału i przywrócić stan programu poprzez wyczyszczenie ramki stosu (sekcji pamięci przechowującej wywołania funkcji i zmienne lokalne), która była używana przez obsługę sygnału.
Interesującą częścią jest sposób, w jaki sigreturn
przywraca stan programu: robi to poprzez przechowywanie wszystkich wartości rejestrów CPU na stosie. Gdy sygnał nie jest już blokowany, sigreturn
zdejmuje te wartości ze stosu, efektywnie resetując rejestry CPU do stanu sprzed obsługi sygnału. Obejmuje to rejestr wskaźnika stosu (RSP), który wskazuje na aktualny szczyt stosu.
Wywołując wywołanie systemowe sigreturn
z łańcucha ROP i dodając wartości rejestrów, które chcielibyśmy, aby zostały załadowane na stosie, jest możliwe kontrolowanie wszystkich wartości rejestrów i w rezultacie wywołanie na przykład wywołania systemowego execve
z /bin/sh
.
Zauważ, że byłoby to rodzajem Ret2syscall, który ułatwia kontrolowanie parametrów do wywołania innych Ret2syscalls:
pageRet2syscallJeśli jesteś ciekawy, to jest struktura sigcontext przechowywana na stosie do późniejszego odzyskania wartości (diagram z tutaj):
Dla lepszego wyjaśnienia sprawdź również:
Przykład
Możesz znaleźć przykład tutaj, gdzie wywołanie signeturn jest konstruowane za pomocą ROP (umieszczając wartość 0xf
w rxa), chociaż to jest ostateczny exploit stamtąd:
Sprawdź również exploit stąd, gdzie plik binarny już wywoływał sigreturn
, więc nie jest konieczne budowanie tego za pomocą ROP:
Inne Przykłady i Referencje
Binarny plik Assembly, który pozwala zapisywać na stosie a następnie wywołuje syscall
sigreturn
. Możliwe jest zapisanie na stosie ret2syscall poprzez strukturę sigreturn i odczytanie flagi znajdującej się w pamięci binarnego pliku.Binarny plik Assembly, który pozwala zapisywać na stosie a następnie wywołuje syscall
sigreturn
. Możliwe jest zapisanie na stosie ret2syscall poprzez strukturę sigreturn (binarny plik zawiera ciąg znaków/bin/sh
).64 bity, brak relro, brak canary, nx, brak pie. Prosty przepełnienie bufora wykorzystujące funkcję
gets
z brakiem gadżetów wykonujących ret2syscall. Łańcuch ROP zapisuje/bin/sh
w.bss
poprzez ponowne wywołanie gets, nadużywa funkcjialarm
aby ustawić eax na0xf
i wywołać SROP w celu uruchomienia powłoki.Program Assembly 64 bitowy, brak relro, brak canary, nx, brak pie. Przepływ umożliwia zapisanie na stosie, kontrolę kilku rejestrów, wywołanie syscall, a następnie wywołanie
exit
. Wybranym syscall'em jestsigreturn
, który ustawia rejestry, przesuwaeip
aby wywołać poprzednią instrukcję syscall i uruchomićmemprotect
w celu ustawienia przestrzeni binarnej narwx
i ustawienia ESP w przestrzeni binarnej. Kontynuując przepływ, program ponownie wywoła read w ESP, ale w tym przypadku ESP będzie wskazywał na następną instrukcję, więc przekazanie shellcode spowoduje zapisanie go jako następnej instrukcji i jego wykonanie.SROP jest używany do nadania uprawnień wykonania (memprotect) miejscu, gdzie umieszczono shellcode.
Last updated