Ret2csu
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)
ret2csu to technika hackingowa używana, gdy próbujesz przejąć kontrolę nad programem, ale nie możesz znaleźć gadżetów, których zwykle używasz do manipulowania zachowaniem programu.
Gdy program korzysta z określonych bibliotek (takich jak libc), ma wbudowane funkcje do zarządzania tym, jak różne części programu komunikują się ze sobą. Wśród tych funkcji znajdują się ukryte skarby, które mogą działać jako nasze brakujące gadżety, szczególnie jeden zwany __libc_csu_init
.
W __libc_csu_init
znajdują się dwie sekwencje instrukcji (gadżetów), które warto wyróżnić:
Pierwsza sekwencja pozwala nam ustawić wartości w kilku rejestrach (rbx, rbp, r12, r13, r14, r15). Są to jakby sloty, w których możemy przechowywać liczby lub adresy, które chcemy wykorzystać później.
Ten gadżet pozwala nam kontrolować te rejestry, wypychając wartości ze stosu do nich.
Druga sekwencja wykorzystuje wartości, które ustawiliśmy, aby wykonać kilka rzeczy:
Przenieś konkretne wartości do innych rejestrów, przygotowując je do użycia jako parametry w funkcjach.
Wykonaj wywołanie do lokalizacji określonej przez dodanie wartości w r15 i rbx, a następnie pomnożenie rbx przez 8.
Może nie znasz żadnego adresu, aby tam zapisać i potrzebujesz instrukcji ret
. Zauważ, że drugi gadżet również kończy się na ret
, ale musisz spełnić pewne warunki, aby do niego dotrzeć:
Warunki będą następujące:
[r12 + rbx*8]
musi wskazywać na adres przechowujący wywoływalną funkcję (jeśli nie ma pomysłu i nie ma pie, możesz po prostu użyć funkcji _init
):
Jeśli _init znajduje się pod 0x400560
, użyj GEF, aby wyszukać wskaźnik w pamięci do niego i sprawić, aby [r12 + rbx*8]
był adresem z wskaźnikiem do _init:
rbp
i rbx
muszą mieć tę samą wartość, aby uniknąć skoku
Istnieją pewne pominięte pops, które musisz wziąć pod uwagę
Innym sposobem na kontrolowanie rdi
i rsi
z gadżetu ret2csu jest dostęp do konkretnych offsetów:
Sprawdź tę stronę po więcej informacji:
BROP - Blind Return Oriented ProgrammingWyobraź sobie, że chcesz wykonać syscall lub wywołać funkcję taką jak write()
, ale potrzebujesz konkretnych wartości w rejestrach rdx
i rsi
jako parametrów. Zwykle szukałbyś gadżetów, które bezpośrednio ustawiają te rejestry, ale nie możesz ich znaleźć.
Tutaj wchodzi w grę ret2csu:
Ustaw rejestry: Użyj pierwszego magicznego gadżetu, aby zrzucić wartości ze stosu do rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) i r15.
Użyj drugiego gadżetu: Gdy te rejestry są ustawione, używasz drugiego gadżetu. To pozwala ci przenieść wybrane wartości do rdx
i rsi
(z r14 i r13, odpowiednio), przygotowując parametry do wywołania funkcji. Co więcej, kontrolując r15
i rbx
, możesz sprawić, że program wywoła funkcję znajdującą się pod adresem, który obliczysz i umieścisz w [r15 + rbx*8]
.
Masz przykład używający tej techniki i wyjaśniający to tutaj, a to jest ostateczny exploit, który wykorzystano:
Zauważ, że poprzedni exploit nie ma na celu uzyskania RCE
, ma na celu jedynie wywołanie funkcji o nazwie win
(biorąc adres win
z stdin wywołując gets w łańcuchu ROP i przechowując go w r15) z trzecim argumentem o wartości 0xdeadbeefcafed00d
.
Następujący exploit został wyciągnięty z tej strony, gdzie używany jest ret2csu, ale zamiast używać wywołania, omija porównania i dociera do ret
po wywołaniu:
Zazwyczaj te przypadki są również podatne na ret2plt + ret2lib, ale czasami musisz kontrolować więcej parametrów, niż można łatwo kontrolować za pomocą gadżetów, które znajdziesz bezpośrednio w libc. Na przykład, funkcja write()
wymaga trzech parametrów, a znalezienie gadżetów do ustawienia wszystkich tych parametrów bezpośrednio może być niemożliwe.