WWW2Exec - __malloc_hook & __free_hook

Reading time: 4 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Malloc Hook

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łując 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:

{{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}}

warning

Zauważ, że haki są wyłączone dla GLIBC >= 2.34. Istnieją inne techniki, które można zastosować w nowoczesnych wersjach GLIBC. Zobacz: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

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:

{{#ref}} ../libc-heap/unsorted-bin-attack.md {{#endref}}

Możliwe jest znalezienie adresu __free_hook, jeśli binarka ma symbole, używając następującego polecenia:

bash
gef➤  p &__free_hook

W poście znajdziesz przewodnik krok po kroku, jak zlokalizować adres hooka zwolnienia bez symboli. W skrócie, w funkcji free:

gef➤  x/20i free
0xf75dedc0 : push   ebx
0xf75dedc1 : call   0xf768f625
0xf75dedc6 : add    ebx,0x14323a
0xf75dedcc :  sub    esp,0x8
0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 :  mov    eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 

W wspomnianym punkcie przerwania w powyższym kodzie w $eax znajdować się będzie adres hooka zwolnienia.

Teraz przeprowadzany jest atak na szybkie biny:

  • Przede wszystkim odkryto, że możliwe jest operowanie na szybkich chunkach 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 chunk o rozmiarze 0x200 w tej lokalizacji, będzie możliwe nadpisanie wskaźnika funkcji, który zostanie wykonany.
  • W tym celu tworzony jest nowy chunk o rozmiarze 0xfc, a połączona funkcja 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 bina, aby wskazywał na poprzednią funkcję __free_hook.
  • Potem tworzony jest chunk o rozmiarze 0x1f8, aby odzyskać z szybkiego bina 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.

Odniesienia

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks