WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Ucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Jak można przeczytać na Oficjalnej stronie GNU, zmienna __malloc_hook
to wskaźnik wskazujący na adres funkcji, która zostanie wywołana za każdym razem, gdy zostanie wywołane malloc()
, przechowywany w sekcji danych biblioteki libc. Dlatego jeśli ten adres zostanie nadpisany na przykład przez One Gadget i zostanie wywołane malloc
, to 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 wiele bajtów, co powoduje, że libc
wywołuje malloc, aby je zaalokować na stercie.
Więcej informacji na temat One Gadget w:
One GadgetZauważ, że haki są wyłączone dla GLIBC >= 2.34. Istnieją inne techniki, które można stosować w nowszych wersjach GLIBC. Zobacz: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
To zostało wykorzystane w jednym z przykładów na stronie, nadużywając ataku na szybki blok po nadużyciu ataku na nieuporządkowany blok:
Unsorted Bin AttackMożna znaleźć adres __free_hook
, jeśli binarny plik ma symbole za pomocą następującej komendy:
W poście znajdziesz przewodnik krok po kroku dotyczący lokalizacji adresu haka free bez symboli. Podsumowując, w funkcji free:
W wspomnianym miejscu przerwania w poprzednim kodzie w $eax
będzie znajdować się adres haka free.
Następnie wykonywany jest szybki atak na bin:
Po pierwsze odkryto, że możliwe jest pracowanie z szybkimi kawałkami 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 kawałek o rozmiarze 0x200 w tej lokalizacji, będzie możliwe nadpisanie wskaźnika funkcji, która zostanie wykonana
W tym celu tworzony jest nowy kawałek o rozmiarze 0xfc
i dwukrotnie wywoływana jest funkcja scalająca z tym wskaźnikiem, w ten sposób uzyskujemy wskaźnik do zwolnionego kawałka o rozmiarze 0xfc*2 = 0x1f8
w szybkim binie.
Następnie wywoływana jest funkcja edycji w tym kawałku, aby zmodyfikować adres fd
tego szybkiego binu tak, aby wskazywał na poprzednią funkcję __free_hook
.
Następnie tworzony jest kawałek o rozmiarze 0x1f8
, aby pobrać z szybkiego binu poprzedni nieużyteczny kawałek, więc tworzony jest kolejny kawałek o rozmiarze 0x1f8
, aby uzyskać kawałek szybkiego binu w __free_hook
, który zostaje nadpisany adresem funkcji system
.
Na koniec zwalniany jest kawałek zawierający ciąg znaków /bin/sh\x00
, wywołując funkcję usuwania, co powoduje wywołanie funkcji __free_hook
, która wskazuje na system z parametrem /bin/sh\x00
.
Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)