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

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:

One Gadget

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:

Unsorted Bin Attack

Moguće je pronaći adresu __free_hook ako binarni fajl ima simbole sa sledećom komandom:

bash
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čine 0xfc*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čine 0x1f8 da bi se dobio fast bin chunk u __free_hook koji se prepisuje sa adresom funkcije system.
  • 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

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