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)
Om net toegang te hê tot 'n 1B overflow laat 'n aanvaller toe om die size
veld van die volgende chunk te verander. Dit laat toe om te manipuleer watter chunks eintlik vrygestel word, wat potensieel 'n chunk kan genereer wat 'n ander legitieme chunk bevat. Die uitbuiting is soortgelyk aan double free of oorvleuelende chunks.
Daar is 2 tipes off by one kwesbaarhede:
Arbitraire byte: Hierdie soort laat toe om daardie byte met enige waarde te oorskryf
Null byte (off-by-null): Hierdie soort laat toe om daardie byte slegs met 0x00 te oorskryf
'n Algemene voorbeeld van hierdie kwesbaarheid kan gesien word in die volgende kode waar die gedrag van strlen
en strcpy
onbestendig is, wat toelaat om 'n 0x00 byte aan die begin van die volgende chunk in te stel.
Dit kan benut word met die House of Einherjar.
As Tcache gebruik word, kan dit benut word vir 'n double free situasie.
Onder andere kontroles, nou wanneer 'n stuk vry is, word die vorige grootte vergelyk met die grootte wat in die metadata se stuk geconfigureer is, wat hierdie aanval redelik kompleks maak vanaf weergawe 2.28.
Hierdie aanval werk nie meer nie weens die gebruik van Tcaches.
Boonop, as jy probeer om dit te misbruik deur groter stukke te gebruik (sodat tcaches nie betrokke is nie), sal jy die fout kry: malloc(): invalid next size (unsorted)
Maak 'n stuk ingesluit binne 'n ander stuk sodat skryftoegang oor daardie tweede stuk toelaat om die ingeslote een te oorskry
Off by one overflow om die grootte metadata-inligting te wysig
Allokeer drie stukke A
, B
en C
(sê groottes 0x20), en nog een om konsolidasie met die top-stuk te voorkom.
Vry C
(ingevoeg in 0x20 Tcache vrylys).
Gebruik stuk A
om oor te vloei op B
. Misbruik off-by-one om die size
veld van B
van 0x21 na 0x41 te wysig.
Nou het ons B
wat die vrye stuk C
bevat
Vry B
en allokeer 'n 0x40 stuk (dit sal hier weer geplaas word)
Ons kan die fd
pointer van C
wysig, wat steeds vry is (Tcache vergiftiging)
3 stukke geheue (a, b, c) word een na die ander gereserveer. Dan word die middelste een vrygelaat. Die eerste een bevat 'n off by one overflow kwesbaarheid en die aanvaller misbruik dit met 'n 0x00 (as die vorige byte 0x10 was, sou dit die middelste stuk aandui dat dit 0x10 kleiner is as wat dit werklik is).
Dan word 2 meer kleiner stukke in die middel vrygelaat stuk (b) allokeer, egter, aangesien b + b->size
nooit die c stuk opdateer nie omdat die aangeduide adres kleiner is as wat dit moet wees.
Dan, b1 en c word vrygelaat. Aangesien c - c->prev_size
steeds na b (b1 nou) wys, word albei in een stuk gekonsolideer. egter, b2 is steeds binne tussen b1 en c.
Laastens, 'n nuwe malloc word uitgevoer wat hierdie geheuegebied herwin wat eintlik b2 gaan bevat, wat die eienaar van die nuwe malloc toelaat om die inhoud van b2 te beheer.
Hierdie beeld verduidelik perfek die aanval:
Off-by-one weens strlen
wat die volgende stuk se size
veld oorweeg.
Tcache word gebruik, so 'n algemene off-by-one aanval werk om 'n arbitrêre skryf primitief met Tcache vergiftiging te verkry.
Dit is moontlik om 'n off by one te misbruik om 'n adres van die heap te lek omdat die byte 0x00 van die einde van 'n string wat oorgeskryf word deur die volgende veld.
Arbitrêre skryf word verkry deur die off by one skryf te misbruik om die pointer na 'n ander plek te laat wys waar 'n valse struktuur met valse pointers gebou sal word. Dan is dit moontlik om die pointer van hierdie struktuur te volg om arbitrêre skryf te verkry.
Die libc adres word gelek omdat as die heap met mmap uitgebrei word, die geheue wat deur mmap toegeken word 'n vaste offset van libc het.
Laastens word die arbitrêre skryf misbruik om in die adres van __free_hook te skryf met 'n one gadget.
Daar is 'n NULL off by one kwesbaarheid in die getline
funksie wat gebruikersinvoerlijnen lees. Hierdie funksie word gebruik om die "sleutel" van die inhoud te lees en nie die inhoud nie.
In die skrywe word 5 aanvanklike stukke geskep:
stuk1 (0x200)
stuk2 (0x50)
stuk5 (0x68)
stuk3 (0x1f8)
stuk4 (0xf0)
stuk verdediging (0x400) om te voorkom dat dit met die top stuk konsolideer
Dan word stuk 1, 5 en 3 vrygelaat, so:
[ 0x200 Stuk 1 (vry) ] [ 0x50 Stuk 2 ] [ 0x68 Stuk 5 (vry) ] [ 0x1f8 Stuk 3 (vry) ] [ 0xf0 Stuk 4 ] [ 0x400 Stuk verdediging ]
[ 0x200 Stuk 1 (vry) ] [ 0x50 Stuk 2 ] [ 0x68 Stuk 5 (vry) ] [ 0x1f8 Stuk 3 (vry) ] [ 0xf0 Stuk 4 ] [ 0x400 Stuk verdediging ]