Off by one overflow
Taarifa Msingi
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
nastrcpy
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.
Mfano wa Kanuni:
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)
Lengo
Fanya kipande kiwe kimejumuishwa ndani ya kipande kingine ili upate ufikiaji wa kuandika juu ya kipande cha pili kuruhusu kubadilisha kile kilichomo
Mahitaji
Kuvuja kwa kipande kimoja ili kurekebisha habari ya metadata ya ukubwa
Shambulio la kawaida la off-by-one
Tenga vipande vitatu
A
,B
naC
(semaje ukubwa 0x20), na kingine kuzuia kujumuishwa na kipande cha juu.Fungua
C
(imeingizwa kwenye orodha ya Tcache ya 0x20).Tumia kipande
A
kumwaga kwenyeB
. Tumia off-by-one kubadilisha uga waukubwa
waB
kutoka 0x21 hadi 0x41.Sasa tuna
B
inayojumuisha kipande huruC
Fungua
B
na tenganisha kipande cha 0x40 (kitawekwa hapa tena)Tunaweza kubadilisha kielekezi cha
fd
kutoka kwaC
, ambayo bado ni huru (Tcache poisoning)
Shambulio la off-by-null
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:
Mifano na Marejeleo Mengine
Off-by-one kwa sababu ya
strlen
inayozingatia uga waukubwa
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 ]
Last updated