Off by one overflow
Last updated
Last updated
Jifunze & zoezi AWS Hacking:Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE) Jifunze & zoezi GCP Hacking: Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)
Kwa kupata kujaza 1B tu, mshambuliaji anaweza kubadilisha uga wa size
kutoka kwa kipande kinachofuata. Hii inaruhusu kuharibu ni vipande vipi ambavyo kimsingi vinaweza kuachiliwa, ikisababisha kipande kinachojumuisha kipande kingine halali. Udukuzi huu ni sawa na kufungua mara mbili au vipande vinavyopishana.
Kuna aina 2 za udhaifu wa kujaza kwa kosa moja:
Bayt ya kiholela: Aina hii inaruhusu kubadilisha bayt hiyo na thamani yoyote
Bayt ya Null (kujaza-kwa-null): Aina hii inaruhusu kubadilisha bayt hiyo tu na 0x00
Mfano wa kawaida wa udhaifu huu unaweza kuonekana kwenye nambari ifuatayo ambapo tabia ya strlen
na strcpy
ni tofauti, ambayo inaruhusu kuweka bayt ya 0x00 mwanzoni mwa kipande kinachofuata.
Hii inaweza kudukuliwa na Nyumba ya Einherjar.
Ikiwa unatumia Tcache, hii inaweza kutumika kwa hali ya kufungua mara mbili.
Miongoni mwa ukaguzi mwingine, sasa kila wakati kipande kinapokuwa huru ukubwa wa awali unalinganishwa na ukubwa uliowekwa katika kipande cha metadata, hii inafanya shambulio hili kuwa ngumu kutoka kwa toleo la 2.28.
Shambulio hili halifanyi kazi tena kutokana na matumizi ya Tcaches.
Zaidi ya hayo, ukijaribu kulitumia kwa kutumia vipande vikubwa (hivyo tcaches havihusiki), utapata kosa: malloc(): invalid next size (unsorted)
Fanya kipande kiwe kimejumuishwa ndani ya kipande kingine ili upate ufikiaji wa kuandika juu ya kipande cha pili kuruhusu kubadilisha kile kilichomo
Kuvuja kwa kipande kimoja ili kurekebisha habari ya metadata ya ukubwa
Tenga vipande vitatu A
, B
na C
(semaje ukubwa 0x20), na kingine kuzuia kujumuishwa na kipande cha juu.
Fungua C
(imeingizwa kwenye orodha ya Tcache ya 0x20).
Tumia kipande A
kumwaga kwenye B
. Tumia off-by-one kubadilisha uga wa ukubwa
wa B
kutoka 0x21 hadi 0x41.
Sasa tuna B
inayojumuisha kipande huru C
Fungua B
na tenganisha kipande cha 0x40 (kitawekwa hapa tena)
Tunaweza kubadilisha kielekezi cha fd
kutoka kwa C
, ambayo bado ni huru (Tcache poisoning)
Vipande 3 vya kumbukumbu (a, b, c) vinahifadhiwa mfululizo. Kisha kati yake inafutwa. Cha kwanza kina kasoro ya kumwaga kwa moja na muhusika anaitumia na 0x00 (ikiwa kibajeti kilichopita kilikuwa 0x10 itafanya kipande cha kati kiashiria kuwa ni kidogo kwa 0x10 kuliko ilivyo kweli).
Kisha, vipande vidogo 2 zaidi vinatengwa katika kipande kilichofutwa kati (b), hata hivyo, kama b + b->ukubwa
kamwe haifanyi kipande c kwa sababu anwani iliyoelekezwa ni ndogo kuliko inavyopaswa.
Kisha, b1 na c vinatengwa. Kwa kuwa c - c->ukubwa_uliotangulia
bado inaelekeza kwa b (sasa b1), vyote viunganishwa katika kipande kimoja. Hata hivyo, b2 bado iko ndani kati ya b1 na c.
Hatimaye, malloc mpya inafanywa kurudisha eneo hili la kumbukumbu ambalo kimsingi litakuwa na b2, kuruhusu mmiliki wa malloc mpya kudhibiti maudhui ya b2.
Picha hii inaelezea kikamilifu shambulio:
Off-by-one kwa sababu ya strlen
inayozingatia uga wa ukubwa
wa kipande cha pili.
Tcache inatumika, hivyo mashambulio ya kawaida ya off-by-one yanafanya kazi kupata msingi wa kuandika wa kiholela na Tcache poisoning.
Inawezekana kutumia off-by-one kuvuja anwani kutoka kwa kipande cha kumbukumbu kwa sababu ya baiti 0x00 mwishoni mwa mnyororo inayobadilishwa na uga ufuatao.
Kuandika kiholela kunapatikana kwa kutumia off-by-one kuunda kielekezi kionyeshe mahali pengine ambapo muundo wa uwongo na kielekezi cha uwongo vitajengwa. Kisha, inawezekana kufuata kielekezi cha muundo huu ili kupata kuandika kiholela.
Anwani ya libc inavuja kwa sababu ikiwa kipande cha kumbukumbu kinaongezwa kwa kutumia mmap, kumbukumbu iliyotengwa na mmap ina mbadala wa kudumu kutoka kwa libc.
Hatimaye kuandika kiholela kunatumika kuandika kwenye anwani ya __free_hook na kifaa cha moja.
Kuna udhaifu wa off-by-one wa NULL katika kazi ya getline
inayosoma mistari ya mwingiliano wa mtumiaji. Kazi hii hutumika kusoma "funguo" ya maudhui na sio maudhui.
Katika mwongozo 5 wa awali wa vipande vinavyoundwa:
kipande1 (0x200)
kipande2 (0x50)
kipande5 (0x68)
kipande3 (0x1f8)
kipande4 (0xf0)
ulinzi wa kipande (0x400) ili kuepuka kujumuishwa na kipande cha juu
Kisha kipande 1, 5 na 3 vinatengwa, hivyo:
[ 0x200 Kipande 1 (huru) ] [ 0x50 Kipande 2 ] [ 0x68 Kipande 5 (huru) ] [ 0x1f8 Kipande 3 (huru) ] [ 0xf0 Kipande 4 ] [ 0x400 Kipande la ulinzi ]
[ 0x200 Kipande 1 (huru) ] [ 0x50 Kipande 2 ] [ 0x68 Kipande 5 (huru) ] [ 0x1f8 Kipande 3 (huru) ] [ 0xf0 Kipande 4 ] [ 0x400 Kipande la ulinzi ]