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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
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:
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 rozmiarze0xfc*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 rozmiarze0x1f8
, aby uzyskać szybki chunk w__free_hook
, który jest nadpisywany adresem funkcjisystem
. - 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
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
- https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.