WWW2Exec - __malloc_hook & __free_hook
Reading time: 4 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Malloc Hook
Kao što možete videti na Official GNU site, promenljiva __malloc_hook
je pokazivač koji pokazuje na adresu funkcije koja će biti pozvana svaki put kada se pozove malloc()
smeštena u sekciji podataka libc biblioteke. Stoga, ako se ova adresa prepiše sa One Gadget, na primer, i pozove se malloc
, One Gadget će biti pozvan.
Da biste pozvali malloc, moguće je čekati da program to pozove ili pozivom printf("%10000$c")
koji alocira previše bajtova, čime libc
poziva malloc da ih alocira na heap-u.
Više informacija o One Gadget-u u:
warning
Imajte na umu da su hook-ovi onemogućeni za GLIBC >= 2.34. Postoje druge tehnike koje se mogu koristiti na modernim verzijama GLIBC. Vidi: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Free Hook
Ovo je zloupotrebljeno u jednom od primera sa stranice koja zloupotrebljava napad na brzi bin nakon što je zloupotrebljen napad na neusmereni bin:
Moguće je pronaći adresu __free_hook
ako binarni fajl ima simbole sa sledećom komandom:
gef➤ p &__free_hook
U postu možete pronaći vodič korak po korak o tome kako locirati adresu slobodnog hook-a bez simbola. Kao sažetak, u funkciji 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
Na pomenutom mestu prekida u prethodnom kodu, u $eax
će se nalaziti adresa slobodnog hook-a.
Sada se vrši fast bin napad:
- Prvo se otkriva da je moguće raditi sa brzim chunk-ovima veličine 200 na lokaciji
__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
- Ako uspemo da dobijemo brzi chunk veličine 0x200 na ovoj lokaciji, biće moguće prepisati pokazivač funkcije koja će biti izvršena.
- Za to se kreira novi chunk veličine
0xfc
i spojena funkcija se poziva sa tim pokazivačem dva puta, na ovaj način dobijamo pokazivač na oslobođeni chunk veličine0xfc*2 = 0x1f8
u fast bin-u. - Zatim se poziva funkcija za uređivanje u ovom chunk-u da bi se modifikovao
fd
adresu ovog fast bin-a da pokazuje na prethodnu__free_hook
funkciju. - Zatim se kreira chunk veličine
0x1f8
da bi se povukao prethodni beskorisni chunk iz fast bin-a, tako da se kreira još jedan chunk veličine0x1f8
da bi se dobio fast bin chunk u__free_hook
koji se prepisuje sa adresom funkcijesystem
. - I konačno, chunk koji sadrži string
/bin/sh\x00
se oslobađa pozivom funkcije za brisanje, aktivirajući__free_hook
funkciju koja pokazuje na system sa/bin/sh\x00
kao parametrom.
Reference
- 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
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.