6.9 KiB
WWW2Exec - __malloc_hook & __free_hook
{% hint style="success" %}
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)
Wesprzyj HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud na githubie.
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:
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
{% hint style="warning" %} 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. {% endhint %}
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:
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
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 rozmiarze0xfc*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 rozmiarze0x1f8
, aby uzyskać kawałek szybkiego binu w__free_hook
, który zostaje nadpisany adresem funkcjisystem
. - 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
- 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.
{% hint style="success" %}
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)
Wesprzyj HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 Grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.