House of Orange

Support HackTricks

Taarifa Msingi

Kanuni

Lengo

  • Tumia malloc_printerr kazi

Mahitaji

  • Badilisha ukubwa wa kipande cha juu

  • Leaks za Libc na heap

Msingi

Baadhi ya msingi muhimu kutoka kwa maoni kutoka mfano huu:

Jambo ni kwamba, katika toleo za zamani za libc, wakati kazi ya malloc_printerr ilipoitwa ingeenda kupitia orodha ya miundo ya _IO_FILE iliyohifadhiwa katika _IO_list_all, na kimsingi kutekeleza kipande cha maagizo katika miundo hiyo. Shambulio hili litatengeneza miundo bandia ya _IO_FILE ambayo tutaiandika kwa _IO_list_all, na kusababisha malloc_printerr kufanya kazi. Kisha itatekeleza anwani yoyote tuliyohifadhi katika miundo ya _IO_FILE, na tutapata utekelezaji wa nambari

Shambulio

Shambulio linaanza kwa kufanikiwa kupata kipande cha juu ndani ya bin isiyosorti. Hii inafanikiwa kwa kuita malloc na ukubwa mkubwa kuliko ukubwa wa kipande cha juu cha sasa lakini mdogo kuliko mmp_.mmap_threshold (chaguo-msingi ni 128K), ambayo vinginevyo itasababisha kutengwa kwa mmap. Mara tu ukubwa wa kipande cha juu unapobadilishwa, ni muhimu kuhakikisha kwamba kipande cha juu + ukubwa wake kinafaa kwenye ukurasa na kwamba biti ya prev_inuse ya kipande cha juu daima imewekwa.

Ili kupata kipande cha juu ndani ya bin isiyosorti, tenganisha kipande ili kuunda kipande cha juu, badilisha ukubwa wa kipande cha juu (kwa kujaza katika kipande kilichotengwa) ili kipande cha juu + ukubwa uwe kwenye ukurasa na biti ya prev_inuse iwe imewekwa. Kisha tengeneza kipande kikubwa kuliko ukubwa mpya wa kipande cha juu. Kumbuka kwamba free kamwe haiitwi ili kupata kipande cha juu ndani ya bin isiyosorti.

Kipande cha juu cha zamani sasa iko ndani ya bin isiyosorti. Kukisia tunaweza kusoma data ndani yake (labda kutokana na udhaifu uliosababisha pia kujaa), inawezekana kuvuja anwani za libc kutoka humo na kupata anwani ya _IO_list_all.

Shambulio la bin isiyosorti linafanywa kwa kudhuru kujaza kwa kuandika topChunk->bk->fwd = _IO_list_all - 0x10. Wakati kipande kipya kinapojitengeneza, kipande cha juu cha zamani kitagawanywa, na kidude kwa bin isiyosorti kitandikwa kwenye _IO_list_all.

Hatua inayofuata ni kupunguza ukubwa wa kipande cha juu cha zamani ili kufanana na kibanda kidogo, hasa kwa kuweka ukubwa wake kuwa 0x61. Hii inahudumia madhumuni mawili:

  1. Kuingizwa kwenye Kibanda Kidogo 4: Wakati malloc inapitia bin isiyosorti na kuona kipande hiki, itajaribu kuweka kwenye kibanda kidogo 4 kutokana na ukubwa wake mdogo. Hii inafanya kipande kumalizia kichwa cha orodha ya kibanda kidogo 4 ambayo ni mahali pa kidude cha FD cha kipande cha _IO_list_all kama tulivyoandika anwani karibu katika _IO_list_all kupitia shambulio la bin isiyosorti.

  2. Kuzindua Ukaguzi wa Malloc: Ujanja wa ukubwa wa kipande hiki utasababisha malloc kufanya ukaguzi wa ndani. Wakati inakagua ukubwa wa kipande cha uongo mbele, ambacho kitakuwa sifuri, itazindua kosa na kuita malloc_printerr.

Ujanja wa kibanda kidogo utakuruhusu kudhibiti kidude cha mbele cha kipande. Kufunika na _IO_list_all hutumiwa kutengeneza miundo bandia ya _IO_FILE. Miundo hiyo imeundwa kwa uangalifu kujumuisha uga muhimu kama vile _IO_write_base na _IO_write_ptr zilizowekwa kwenye thamani ambazo zinapita ukaguzi wa ndani katika libc. Aidha, jedwali la kuruka linajengwa ndani ya miundo bandia, ambapo kidude cha maagizo kimehifadhiwa kwenye anwani ambapo nambari za aina yoyote (k.m., kazi ya system) zinaweza kutekelezwa.

Kufupisha sehemu iliyobaki ya mbinu:

  • Punguza Kipande cha Juu cha Zamani: Badilisha ukubwa wa kipande cha juu cha zamani kuwa 0x61 ili kukifanya kifae kwenye kibanda kidogo.

  • Sanidi Miundo Bandia ya _IO_FILE: Funika kipande cha juu cha zamani na miundo bandia ya _IO_FILE na weka uga kwa uangalifu kudhibiti mtiririko wa utekelezaji.

Hatua inayofuata ni kutengeneza miundo bandia ya _IO_FILE inayofunika na kipande cha juu cha zamani kilichopo sasa katika bin isiyosorti. Bytes za kwanza za miundo hii zimeundwa kwa uangalifu kujumuisha kidude kwa amri (k.m., "/bin/sh") ambayo itatekelezwa.

Uga muhimu katika miundo bandia ya _IO_FILE, kama vile _IO_write_base na _IO_write_ptr, zinawekwa kwenye thamani ambazo zinapita ukaguzi wa ndani katika libc. Aidha, jedwali la kuruka linajengwa ndani ya miundo bandia, ambapo kidude cha maagizo kimehifadhiwa kwenye anwani ambapo nambari za aina yoyote zinaweza kutekelezwa. Kawaida, hii itakuwa anwani ya kazi ya system au kazi nyingine inayoweza kutekeleza amri za terminali.

Shambulio linakamilika wakati wito wa malloc unazindua utekelezaji wa nambari kupitia miundo ya _IO_FILE iliyodanganyifu. Hii inaruhusu utekelezaji wa nambari za aina yoyote, kawaida ikisababisha kuzaliwa kwa terminali au mzigo mwingine wenye nia mbaya kutekelezwa.

Muhtasari wa Shambulio:

  1. Sanidi kipande cha juu: Tenga kipande na ubadilishe ukubwa wa kipande cha juu.

  2. Lazimisha kipande cha juu kuingia kwenye bin isiyosorti: Tenga kipande kikubwa.

  3. Vuja anwani za libc: Tumia udhaifu kusoma kutoka kwenye bin isiyosorti.

  4. Tekeleza shambulio la bin isiyosorti: Andika kwenye _IO_list_all kwa kutumia kujaza.

  5. Punguza kipande cha juu cha zamani: Badilisha ukubwa wake ili kifae kwenye kibanda kidogo.

  6. Sanidi miundo bandia ya _IO_FILE: Tengeneza miundo bandia ya faili kudhibiti mtiririko wa utekelezaji.

  7. Zindua utekelezaji wa nambari: Tenga kipande kutekeleza shambulio na kukimbia nambari za aina yoyote.

Mbinu hii inatumia mifumo ya usimamizi wa kibanda, uvujaji wa habari za libc, na mafuriko ya kibanda kufikia utekelezaji wa nambari bila kuita moja kwa moja free. Kwa kuhakikisha miundo bandia ya _IO_FILE imeundwa kwa uangalifu na kuwekwa mahali sahihi, shambulio linaweza kudhibiti mtiririko wakati wa operesheni za kawaida za kutengeneza kumbukumbu. Hii inaruhusu utekelezaji wa nambari za aina yoyote, ikisababisha kuzaliwa kwa terminali au shughuli nyingine zenye nia mbaya.

Marejeo

unga mkono HackTricks

Last updated