WWW2Exec - __malloc_hook & __free_hook

unga mkono HackTricks

Malloc Hook

Kama unavyoweza Tovuti Rasmi ya GNU, kipengele __malloc_hook ni kipande kinachoelekeza kwenye anwani ya kazi itakayoitwa wakati wowote malloc() inaitwa imehifadhiwa kwenye sehemu ya data ya maktaba ya libc. Kwa hivyo, ikiwa anwani hii itabadilishwa na One Gadget kwa mfano na malloc inaitwa, One Gadget itaitwa.

Kuita malloc inawezekana kusubiri programu iite au kwa kuita printf("%10000$c") ambayo inaendelea kuchukua nafasi nyingi kufanya libc iite malloc kuzitenga kwenye rundo.

Maelezo zaidi kuhusu One Gadget katika:

One Gadget

Tafadhali elewa kwamba vitanzi vime lemazwa kwa GLIBC >= 2.34. Kuna njia nyingine ambazo zinaweza kutumika kwenye toleo za kisasa za GLIBC. Angalia: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Hii ilidhulumiwa katika moja ya mfano kutoka kwenye ukurasa ukidhulumu shambulio la rundo la haraka baada ya kudhulumiwa shambulio la rundo lisilo na mpangilio:

Unsorted Bin Attack

Inawezekana kupata anwani ya __free_hook ikiwa binary ina alama na amri ifuatayo:

gef➤  p &__free_hook

Katika chapisho unaweza kupata mwongozo wa hatua kwa hatua juu ya jinsi ya kutambua anwani ya kitanzi cha bure bila alama. Kwa muhtasari, katika kazi ya bure:

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]--- VUNJA HAPA
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

Katika kuvunja iliyotajwa katika msimbo uliopita katika $eax kutakuwa na anwani ya kitanzi cha bure.

Sasa shambulio la bendi ya haraka linatekelezwa:

  • Kwanza kabisa inagundulika kuwa ni rahisi kufanya kazi na vipande vya haraka vya ukubwa wa 200 katika eneo la __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

  • Ikiwa tunaweza kupata kipande cha haraka cha ukubwa wa 0x200 katika eneo hili, itawezekana kubadilisha kidole cha kazi ambacho kitatekelezwa

  • Kwa hili, kipande kipya cha ukubwa wa 0xfc kinajengwa na kuitwa kazi iliyochanganywa mara mbili na kidole hicho, njia hii tunapata kidole kwa kipande kilichofutwa cha ukubwa wa 0xfc*2 = 0x1f8 katika bendi ya haraka.

  • Kisha, kazi ya hariri inaitwa kwenye kipande hiki kurekebisha anwani ya fd ya bendi hii ya haraka ili ielekee kwenye kazi ya awali ya __free_hook.

  • Kisha, kipande cha ukubwa wa 0x1f8 kinajengwa ili kurejesha kutoka kwa bendi ya haraka kipande kisichofaa cha awali hivyo kipande kingine cha ukubwa wa 0x1f8 kinajengwa ili kupata kipande cha bendi ya haraka katika __free_hook ambayo inabadilishwa na anwani ya kazi ya system.

  • Na mwishowe kipande kinachohifadhi string /bin/sh\x00 kinawekwa huru kwa kuita kazi ya kufuta, kuzindua kazi ya __free_hook ambayo inaelekeza kwa mfumo na /bin/sh\x00 kama parameter.

Marejeo

Last updated