WWW2Exec - __malloc_hook & __free_hook

Ondersteun HackTricks

Malloc Hook

Soos jy kan sien op die Offisiële GNU-webwerf, is die veranderlike __malloc_hook 'n wyser wat wys na die adres van 'n funksie wat geroep sal word wanneer malloc() geroep word gestoor in die data-afdeling van die libc-biblioteek. Daarom, as hierdie adres oorskryf word met 'n One Gadget byvoorbeeld en malloc word geroep, sal die One Gadget geroep word.

Om malloc te roep, is dit moontlik om te wag vir die program om dit te roep of deur printf("%10000$c") te roep wat te veel bytes toewys en libc dwing om hulle in die heap toe te ken.

Meer inligting oor One Gadget in:

One Gadget

Let daarop dat hake uitgeskakel is vir GLIBC >= 2.34. Daar is ander tegnieke wat op moderne GLIBC-weergawes gebruik kan word. Sien: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Dit is misbruik in een van die voorbeelde van die bladsy wat 'n vinnige bin-aanval misbruik het nadat 'n ongesorteerde bin-aanval misbruik is:

Unsorted Bin Attack

Dit is moontlik om die adres van __free_hook te vind as die binêre lêers simbole het met die volgende bevel:

gef➤  p &__free_hook

In die pos kan jy 'n stap-vir-stap-gids vind oor hoe om die adres van die vrye haak sonder simbole te vind. As 'n opsomming, in die vrye funksie:

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

In die genoemde breek in die vorige kode sal die adres van die vrye haak in $eax geleë wees.

Nou word 'n vinnige bin-aanval uitgevoer:

  • Eerstens word ontdek dat dit moontlik is om met vinnige stukke van grootte 200 op die __free_hook-plek te werk:

  • 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

  • As ons daarin slaag om 'n vinnige stuk van grootte 0x200 op hierdie plek te kry, sal dit moontlik wees om 'n funksie-aanwyser te oorskryf wat uitgevoer sal word

  • Hiervoor word 'n nuwe stuk van grootte 0xfc geskep en die saamgevoegde funksie word twee keer geroep met daardie aanwyser, op hierdie manier verkry ons 'n aanwyser na 'n vrygemaakte stuk van grootte 0xfc*2 = 0x1f8 in die vinnige bin.

  • Dan word die wysigingsfunksie in hierdie stuk geroep om die fd-adres van hierdie vinnige bin te wysig om na die vorige __free_hook-funksie te wys.

  • Dan word 'n stuk met grootte 0x1f8 geskep om uit die vinnige bin die vorige nuttelose stuk te herwin sodat 'n ander stuk van grootte 0x1f8 geskep kan word om 'n vinnige bin-stuk in die __free_hook te kry wat oorskryf is met die adres van die system-funksie.

  • En uiteindelik word 'n stuk wat die string /bin/sh\x00 bevat, vrygemaak deur die verwyderingsfunksie te roep, wat die __free_hook-funksie aanroep wat na die stelsel met /bin/sh\x00 as parameter wys.

Verwysings

Ondersteun HackTricks

Last updated