WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
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)
Jak można zobaczyć na oficjalnej stronie GNU, zmienna __malloc_hook
jest wskaźnikiem wskazującym na adres funkcji, która będzie wywoływana za każdym razem, gdy wywoływana jest malloc()
, przechowywana w sekcji danych biblioteki libc. Dlatego, jeśli ten adres zostanie nadpisany na przykład przez One Gadget, a malloc
zostanie wywołane, One Gadget zostanie wywołany.
Aby wywołać malloc, można poczekać, aż program go wywoła, lub **wywołać printf("%10000$c")**, co alokuje zbyt wiele bajtów, co powoduje, że
libc` wywołuje malloc, aby je alokować w stercie.
Więcej informacji o One Gadget w:
One GadgetZauważ, że haki są wyłączone dla GLIBC >= 2.34. Istnieją inne techniki, które można wykorzystać w nowoczesnych wersjach GLIBC. Zobacz: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
To zostało nadużyte w jednym z przykładów na stronie, nadużywając ataku na szybki bin po nadużyciu ataku na niesortowany bin:
Unsorted Bin AttackMożliwe jest znalezienie adresu __free_hook
, jeśli binarka ma symbole, używając następującego polecenia:
W poście znajdziesz przewodnik krok po kroku, jak zlokalizować adres hooka zwolnienia bez symboli. Podsumowując, w funkcji free:
W wspomnianym punkcie przerwania w poprzednim kodzie w $eax
znajdować się będzie adres hooka zwolnienia.
Teraz przeprowadzany jest atak na szybkie biny:
Przede wszystkim odkryto, że możliwe jest pracowanie z szybkim chunkiem o rozmiarze 200 w lokalizacji __free_hook
:
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
Jeśli uda nam się uzyskać szybki chunk o rozmiarze 0x200 w tej lokalizacji, będzie możliwe nadpisanie wskaźnika funkcji, która zostanie wykonana.
W tym celu tworzony jest nowy chunk o rozmiarze 0xfc
, a funkcja scalająca jest wywoływana z tym wskaźnikiem dwukrotnie, w ten sposób uzyskujemy wskaźnik do zwolnionego chunka o rozmiarze 0xfc*2 = 0x1f8
w szybkim binie.
Następnie wywoływana jest funkcja edytująca w tym chunku, aby zmodyfikować adres fd
tego szybkiego binu, aby wskazywał na poprzednią funkcję __free_hook
.
Następnie tworzony jest chunk o rozmiarze 0x1f8
, aby odzyskać z szybkiego binu poprzedni bezużyteczny chunk, więc tworzony jest kolejny chunk o rozmiarze 0x1f8
, aby uzyskać szybki chunk w __free_hook
, który jest nadpisywany adresem funkcji system
.
A na koniec chunk zawierający ciąg /bin/sh\x00
jest zwalniany, wywołując funkcję usuwania, co uruchamia funkcję __free_hook
, która wskazuje na system z /bin/sh\x00
jako parametrem.
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)