Off by one overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Kuwa na ufikiaji wa overflow wa 1B inaruhusu mshambuliaji kubadilisha uwanja wa size
kutoka kwa kipande kinachofuata. Hii inaruhusu kubadilisha ni vipande vipi ambavyo vimeachiliwa, na huenda ikazalisha kipande kinachojumuisha kipande kingine halali. Utekelezaji ni sawa na double free au vipande vinavyovutana.
Kuna aina 2 za udhaifu wa off by one:
Byte isiyo na mpangilio: Aina hii inaruhusu kuandika byte hiyo kwa thamani yoyote
Byte ya Null (off-by-null): Aina hii inaruhusu kuandika byte hiyo tu kwa 0x00
Mfano wa kawaida wa udhaifu huu unaweza kuonekana katika msimbo ufuatao ambapo tabia ya strlen
na strcpy
haiko sawa, ambayo inaruhusu kuweka byte ya 0x00 mwanzoni mwa kipande kinachofuata.
Hii inaweza kutumiwa na House of Einherjar.
Ikiwa unatumia Tcache, hii inaweza kutumika katika hali ya double free.
Kati ya ukaguzi mwingine, sasa kila wakati kipande kinapokuwa huru, ukubwa wa awali unalinganishwa na ukubwa uliowekwa katika metadata ya kipande, na kufanya shambulio hili kuwa gumu sana kuanzia toleo la 2.28.
Shambulio hili halifanyi kazi tena kutokana na matumizi ya Tcaches.
Zaidi ya hayo, ikiwa unajaribu kulitumia kwa kutumia vipande vikubwa (hivyo tcaches hazihusiki), utapata kosa: malloc(): invalid next size (unsorted)
Fanya kipande kiwe ndani ya kipande kingine ili kuandika ufikiaji juu ya kipande hicho cha pili kuruhusu kuandika juu ya kile kilichomo
Off by one overflow kubadilisha taarifa za metadata ya ukubwa
Panga vipande vitatu A
, B
na C
(sema ukubwa 0x20), na kingine ili kuzuia kuunganishwa na kipande cha juu.
Fungua C
(iliyoingizwa kwenye orodha ya bure ya 0x20 Tcache).
Tumia kipande A
kujaa kwenye B
. Dhulumu off-by-one kubadilisha uwanja wa size
wa B
kutoka 0x21 hadi 0x41.
Sasa tuna B
inayoshikilia kipande huru C
Fungua B
na panga kipande cha 0x40 (kitakuwa kimewekwa hapa tena)
Tunaweza kubadilisha kiashiria cha fd
kutoka C
, ambacho bado ni huru (Tcache poisoning)
Vipande 3 vya kumbukumbu (a, b, c) vinahifadhiwa moja baada ya nyingine. Kisha kipande cha kati kinafunguliwa. Kipande cha kwanza kina udhaifu wa off by one overflow na mshambuliaji anautumia kwa 0x00 (ikiwa byte ya awali ilikuwa 0x10 ingesababisha kipande cha kati kuonyesha kwamba ni 0x10 kidogo kuliko ilivyo).
Kisha, vipande viwili vidogo zaidi vinapangwa katika kipande cha kati kilichofunguliwa (b), hata hivyo, kama b + b->size
kamwe havisasisha kipande c kwa sababu anwani iliyoonyeshwa ni ndogo kuliko inavyopaswa.
Kisha, b1 na c vinafunguliwa. Kama c - c->prev_size
bado inaonyesha b (b1 sasa), vyote vinaundwa katika kipande kimoja. Hata hivyo, b2 bado kiko kati ya b1 na c.
Hatimaye, malloc mpya inafanywa ikirejesha eneo hili la kumbukumbu ambalo kwa kweli litakuwa na b2, ikiruhusu mmiliki wa malloc mpya kudhibiti maudhui ya b2.
Picha hii inaelezea shambulio kwa ukamilifu:
Off-by-one kwa sababu ya strlen
ikizingatia uwanja wa size
wa kipande kinachofuata.
Tcache inatumika, hivyo shambulio la jumla la off-by-one linafanya kazi kupata primitive ya kuandika isiyo na mipaka na Tcache poisoning.
Inawezekana kudhulumu off by one ili kuvuja anwani kutoka kwenye heap kwa sababu byte 0x00 ya mwisho wa mfuatano inayoandikwa na uwanja unaofuata.
Kuandika isiyo na mipaka kunapatikana kwa kudhulumu kuandika off by one ili kufanya kiashiria kiashirie mahali pengine ambapo muundo wa uwongo na viashiria vya uwongo vitajengwa. Kisha, inawezekana kufuata kiashiria cha muundo huu ili kupata kuandika isiyo na mipaka.
Anwani ya libc inavuja kwa sababu ikiwa heap inapanuliwa kwa kutumia mmap, kumbukumbu iliyopangwa na mmap ina offset iliyowekwa kutoka libc.
Hatimaye, kuandika isiyo na mipaka kunadhulumiwa kuandika kwenye anwani ya __free_hook na gadget moja.
Kuna udhaifu wa NULL off by one katika kazi ya getline
inayosoma mistari ya ingizo la mtumiaji. Kazi hii inatumika kusoma "funguo" ya maudhui na sio maudhui.
Katika andiko la 5, vipande vya awali vinaundwa:
kipande1 (0x200)
kipande2 (0x50)
kipande5 (0x68)
kipande3 (0x1f8)
kipande4 (0xf0)
kipande cha ulinzi (0x400) ili kuepuka kuunganishwa na kipande cha juu
Kisha kipande 1, 5 na 3 vinafunguliwa, hivyo:
[ 0x200 Kipande 1 (huru) ] [ 0x50 Kipande 2 ] [ 0x68 Kipande 5 (huru) ] [ 0x1f8 Kipande 3 (huru) ] [ 0xf0 Kipande 4 ] [ 0x400 Kipande cha ulinzi ]
[ 0x200 Kipande 1 (huru) ] [ 0x50 Kipande 2 ] [ 0x68 Kipande 5 (huru) ] [ 0x1f8 Kipande 3 (huru) ] [ 0xf0 Kipande 4 ] [ 0x400 Kipande cha ulinzi ]