WWW2Exec - __malloc_hook & __free_hook

Wesprzyj HackTricks

Hook Malloc

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 Gadget

Zauważ, ż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.

Hook Free

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 Attack

Można znaleźć adres __free_hook, jeśli binarny plik ma symbole za pomocą następującej komendy:

gef➤  p &__free_hook

W poście znajdziesz przewodnik krok po kroku dotyczący lokalizacji adresu haka free bez symboli. Podsumowując, w funkcji free:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- PRZERWIJ TUTAJ
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

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:

  • gef➤  p &__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.

Referencje

Wesprzyj HackTricks

Last updated