WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
Kako možete videti na zvaničnom GNU sajtu, promenljiva __malloc_hook
je pokazivač koji pokazuje na adresu funkcije koja će biti pozvana svaki put kada se pozove malloc()
koja je smeštena u delu 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 bi se pozvao malloc moguće je sačekati da program to pozove ili pozivom printf("%10000$c")
koji alocira previše bajtova čime libc
poziva malloc da ih alocira u hipu.
Više informacija o One Gadget-u:
Imajte na umu da su hook-ovi onemogućeni za GLIBC >= 2.34. Postoje druge tehnike koje se mogu koristiti na modernim verzijama GLIBC-a. Pogledajte: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Ovo je zloupotrebljeno u jednom od primera sa stranice zloupotrebe brze binarne napasti nakon što je zloupotrebljena napadom na nesortiranu binu:
Moguće je pronaći adresu __free_hook
ako binarni fajl ima simbole pomoću sledeće komande:
U postu možete pronaći vodič korak po korak o tome kako locirati adresu free hook-a bez simbola. Ukratko, u funkciji free:
U pomenutom prekidu u prethodnom kodu u $eax
će biti locirana adresa free hook-a.
Sada je izvršen brzi binarni napad:
Prvo je otkriveno da je moguće raditi sa brzim delovima veličine 200 na lokaciji __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 deo veličine 0x200 na ovoj lokaciji, biće moguće prepisati pokazivač funkcije koji će biti izvršen
Za to, kreira se novi deo veličine 0xfc
i poziva se spojena funkcija sa tim pokazivačem dva puta, na taj način dobijamo pokazivač na oslobođeni deo veličine 0xfc*2 = 0x1f8
u brzom binu.
Zatim se poziva funkcija za uređivanje u ovom delu kako bi se izmenila adresa fd
ovog brzog bina da pokazuje na prethodnu __free_hook
funkciju.
Zatim se kreira deo veličine 0x1f8
kako bi se povukao prethodno beskoristan deo iz brzog bina tako da se kreira još jedan deo veličine 0x1f8
kako bi se dobio brzi bin deo na lokaciji __free_hook
koji je prepisan adresom funkcije system
.
Na kraju se oslobođuje deo koji sadrži string /bin/sh\x00
pozivom funkcije brisanja, pokreće se funkcija __free_hook
koja pokazuje na sistem sa /bin/sh\x00
kao parametrom.