WWW2Exec - __malloc_hook & __free_hook

Podržite HackTricks

Malloc Hook

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:

One Gadget

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.

Free Hook

Ovo je zloupotrebljeno u jednom od primera sa stranice zloupotrebe brze binarne napasti nakon što je zloupotrebljena napadom na nesortiranu binu:

Unsorted Bin Attack

Moguće je pronaći adresu __free_hook ako binarni fajl ima simbole pomoću sledeće komande:

gef➤  p &__free_hook

U postu možete pronaći vodič korak po korak o tome kako locirati adresu free hook-a bez simbola. Ukratko, u funkciji 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]--- PREKID OVDE
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

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:

  • 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 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.

Reference

Last updated