hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md

6.8 KiB

WWW2Exec - __malloc_hook & __free_hook

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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 sekciji podataka libc biblioteke. Stoga, ako se ova adresa prepiše sa One Gadget-om 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 pozivanjem printf("%10000$c") koji alocira previše bajtova čime libc poziva malloc da ih alocira na hipu.

Više informacija o One Gadget-u:

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

{% hint style="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-a. Pogledajte: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md. {% endhint %}

Free Hook

Ovo je zloupotrebljeno u jednom od primera sa stranice zloupotrebe brze binarne napade nakon što je zloupotrebljen napad na nesortiranu binu:

{% content-ref url="../heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}

Dobar trik (od ovde) za pronalaženje lokacije free hook-a ako binarni fajl ima simbole je uraditi nešto slično:

gef➤  set __free_hook = 0xfacade
gef➤  search-pattern 0xfacade

U istom postu možete pronaći detaljan vodič korak po korak o tome kako pronaći adresu slobodnog kuka 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]
0xf75deddb <free+27>:  test   eax,eax ;<--- PREKID OVDE
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

U pomenutom prekidu u prethodnom kodu, u $eax će se nalaziti adresa slobodnog kuka.

Sada se izvodi brzi napad na bin:

  • 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 koja će biti izvršena
  • 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 funkciju __free_hook.
  • 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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: