SROP - Sigreturn-Oriented Programming
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Sigreturn
to specjalny syscall, który jest głównie używany do sprzątania po zakończeniu działania obsługi sygnałów. 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ą handlera sygnałów, specjalnej funkcji zaprojektowanej do radzenia sobie z sygnałami.
Po zakończeniu działania handlera sygnałów program musi wznowić swój poprzedni stan, jakby nic się nie stało. Tutaj wchodzi w grę sigreturn
. Pomaga programowi powrócić z handlera sygnałów i przywraca stan programu, sprzątając ramkę stosu (sekcję pamięci, która przechowuje wywołania funkcji i zmienne lokalne), która była używana przez handlera sygnałów.
Interesującą częścią jest to, jak sigreturn
przywraca stan programu: robi to, przechowując wszystkie wartości rejestrów CPU na stosie. Gdy sygnał nie jest już zablokowany, sigreturn
zdejmuje te wartości ze stosu, efektywnie resetując rejestry CPU do ich stanu sprzed obsługi sygnału. Obejmuje to rejestr wskaźnika stosu (RSP), który wskazuje na aktualny szczyt stosu.
Wywołując syscall sigreturn
z łańcucha ROP i dodając wartości rejestrów, które chcielibyśmy załadować na stos, możliwe jest kontrolowanie wszystkich wartości rejestrów, a tym samym wywołanie na przykład syscall execve
z /bin/sh
.
Zauważ, że byłoby to rodzaj Ret2syscall, który znacznie ułatwia kontrolowanie parametrów do wywołania innych Ret2syscalls:
Ret2syscallJeśli jesteś ciekawy, to jest struktura sigcontext przechowywana na stosie, aby później odzyskać wartości (diagram z tutaj):
Dla lepszego wyjaśnienia sprawdź również:
Możesz znaleźć przykład tutaj, gdzie wywołanie signeturn jest konstruowane za pomocą ROP (umieszczając w rxa wartość 0xf
), chociaż to jest ostateczny exploit stamtąd:
Sprawdź również eksploit stąd, gdzie binarka już wywoływała sigreturn
, więc nie ma potrzeby budować tego z ROP:
Program binarny w asemblerze, który pozwala na zapis do stosu i następnie wywołuje syscall sigreturn
. Możliwe jest zapisanie na stosie ret2syscall za pomocą struktury sigreturn i odczytanie flagi, która znajduje się w pamięci binarnej.
Program binarny w asemblerze, który pozwala na zapis do stosu i następnie wywołuje syscall sigreturn
. Możliwe jest zapisanie na stosie ret2syscall za pomocą struktury sigreturn (program binarny zawiera ciąg /bin/sh
).
64 bity, brak relro, brak canary, nx, brak pie. Prosty przepełnienie bufora wykorzystujące funkcję gets
z brakiem gadżetów, które wykonują ret2syscall. Łańcuch ROP zapisuje /bin/sh
w .bss
wywołując ponownie gets, wykorzystuje funkcję alarm
do ustawienia eax na 0xf
, aby wywołać SROP i uruchomić powłokę.
Program w asemblerze 64 bity, brak relro, brak canary, nx, brak pie. Przepływ pozwala na zapis do stosu, kontrolę kilku rejestrów i wywołanie syscall, a następnie wywołuje exit
. Wybrany syscall to sigreturn
, który ustawi rejestry i przeniesie eip
, aby wywołać poprzednią instrukcję syscall i uruchomić memprotect
, aby ustawić przestrzeń binarną na rwx
i ustawić ESP w przestrzeni binarnej. Kontynuując przepływ, program ponownie wywoła read do ESP, ale w tym przypadku ESP będzie wskazywał na następną instrukcję, więc przekazanie shellcode'u zapisze go jako następną instrukcję i wykona go.
SROP jest używane do nadania uprawnień wykonawczych (memprotect) miejscu, w którym umieszczono shellcode.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)