House of Roman

Support HackTricks

Taarifa Msingi

Hii ilikuwa mbinu ya kuvutia sana iliyoruhusu RCE bila kuvuja kupitia fastbins bandia, shambulio la unsorted_bin na kubadilisha maeneo ya kumbukumbu kwa kiasi kinachofaa. Hata hivyo, imefanyiwa marekebisho.

Kanuni

Lengo

  • RCE kwa kudanganya pointers za kihusishi

Mahitaji

  • Hariri pointers za fastbin na unsorted bin

  • Lazima ujaribu kwa nguvu bits 12 za nasibu (0.02% nafasi) ya kufanya kazi

Hatua za Shambulio

Sehemu 1: Fastbin Chunk inaelekeza kwa __malloc_hook

Unda vipande kadhaa:

  • fastbin_victim (0x60, offset 0): Kipande cha UAF kitakachotumiwa baadaye kuhariri pointer ya kumbukumbu ili ielekee thamani ya LibC.

  • chunk2 (0x80, offset 0x70): Kwa upangilio mzuri

  • main_arena_use (0x80, offset 0x100)

  • relative_offset_heap (0x60, offset 0x190): kiasi cha kihusishi kwenye kipande cha 'main_arena_use'

Kisha free(main_arena_use) ambayo itaweka kipande hiki kwenye orodha isiyopangwa na kupata pointer kwa main_arena + 0x68 katika pointers za fd na bk.

Sasa inaundwa kipande kipya fake_libc_chunk(0x60) kwa sababu italeta pointers kwa main_arena + 0x68 katika fd na bk.

Kisha relative_offset_heap na fastbin_victim zinaachiliwa.

/*
Current heap layout:
0x0:   fastbin_victim       - size 0x70
0x70:  alignment_filler     - size 0x90
0x100: fake_libc_chunk      - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main        - size 0x20
0x190: relative_offset_heap - size 0x70

bin layout:
fastbin:  fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
  • fastbin_victim ina fd inayoelekeza relative_offset_heap

  • relative_offset_heap ni mbali ya umbali kutoka kwa fake_libc_chunk, ambayo ina pointer kwa main_arena + 0x68

  • Kwa kubadilisha herufi ya mwisho ya fastbin_victim.fd inawezekana kufanya fastbin_victim ielekee kwa main_arena + 0x68

Kwa hatua zilizotangulia, mshambuliaji anahitaji kuwa na uwezo wa kubadilisha kidude cha fd cha fastbin_victim.

Kisha, main_arena + 0x68 sio ya kuvutia sana, hivyo turekebishe ili kidude kiashirie __malloc_hook.

Tambua kwamba __memalign_hook kawaida huanza na 0x7f na sifuri kabla yake, kwa hivyo inawezekana kuidanganya kama thamani katika fast bin ya 0x70. Kwa sababu biti 4 za mwisho za anwani ni za kubahatisha kuna 2^4=16 uwezekano wa thamani kuishia kuelekeza mahali tunapovutiwa. Kwa hivyo shambulio la BF linatekelezwa hapa ili kidude kiishie kama: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).

(Kwa habari zaidi kuhusu sehemu iliyobaki ya herufi angalia maelezo katika how2heap mfano). Ikiwa BF haifanyi kazi, programu itaanguka (kwa hivyo anza tena hadi itakapofanya kazi).

Kisha, 2 mallocs zinatekelezwa kuondoa vipande 2 vya mwanzo vya fast bin na ya tatu inatengwa kupata kidude katika __malloc_hook:

malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

Sehemu 2: Shambulio la unsorted_bin

Kwa maelezo zaidi unaweza kuangalia:

Unsorted Bin Attack

Lakini kimsingi inaruhusu kuandika main_arena + 0x68 kwenye eneo lolote lililowekwa katika chunk->bk. Na kwa shambulio tunachagua __malloc_hook. Kisha, baada ya kuibadilisha tutatumia ubadilishaji wa kihesabu) kuashiria kwa one_gadget.

Kwa hili tunaanza kupata kipande na kukitia kwenye unsorted bin:

uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate

puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);

Tumia UAF katika sehemu hii kuashiria unsorted_bin_ptr->bk kwa anwani ya __malloc_hook (tulilazimisha hii hapo awali).

Tafadhali kumbuka kuwa shambulio hili linaharibu sanduku lisilo na mpangilio (hivyo ndogo na kubwa pia). Kwa hivyo tunaweza kutumia alokesheni kutoka kwa sanduku la haraka sasa (programu yenye ngumu zaidi inaweza kufanya alokesheni nyingine na kugonga), na ili kuzindua hii lazima aloke ukubwa sawa au programu itaanguka.

Kwa hivyo, ili kuzindua andika ya main_arena + 0x68 katika __malloc_hook tunafanya baada ya kuweka __malloc_hook katika unsorted_bin_ptr->bk tunahitaji tu kufanya: malloc(0x80)

Hatua 3: Weka __malloc_hook kuwa mfumo

Katika hatua ya kwanza tulimaliza kudhibiti kipande kinachohusisha __malloc_hook (katika kipengele cha malloc_hook_chunk) na katika hatua ya pili tulifanikiwa kuandika main_arena + 0x68 hapa.

Sasa, tunatumia uandishi wa sehemu katika malloc_hook_chunk kutumia anwani ya libc tuliyoiandika hapo (main_arena + 0x68) ku ashiria anwani ya one_gadget.

Hapa ndipo inapohitajika kuvunja nguvu 12 bits za nasibu (maelezo zaidi katika how2heap mfano).

Hatimaye, baada ya anwani sahihi kuandikwa, ita malloc na kuzindua one_gadget.

Marejeo

Support HackTricks

Last updated