Heap Overflow

Reading time: 6 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

'n Heap overflow is soos 'n stack overflow maar in die heap. Basies beteken dit dat 'n sekere ruimte in die heap gereserveer is om data te stoor en gestoorde data was groter as die gereserveerde ruimte.

In stack overflows weet ons dat sommige registers soos die instruksie-aanwyser of die stack-raam gaan herstel word vanaf die stack en dit kan moontlik misbruik word. In die geval van heap overflows, daar is geen sensitiewe inligting wat standaard in die heap chunk gestoor word wat oorgeloop kan word nie. Dit kan egter sensitiewe inligting of aanwysers wees, so die kritikaliteit van hierdie kwesbaarheid hang af van watter data oorgeskryf kan word en hoe 'n aanvaller dit kan misbruik.

tip

Om overflow offsets te vind, kan jy dieselfde patrone gebruik soos in stack overflows.

Stack Overflows vs Heap Overflows

In stack overflows is die rangskikking en data wat teenwoordig gaan wees in die stack op die oomblik dat die kwesbaarheid geaktiveer kan word, redelik betroubaar. Dit is omdat die stack lineêr is, altyd toeneem in botsende geheue, in spesifieke plekke van die program se uitvoering stoor die stack geheue gewoonlik soortgelyke tipe data en dit het 'n spesifieke struktuur met sommige aanwysers aan die einde van die stack-gedeelte wat deur elke funksie gebruik word.

In die geval van 'n heap overflow, is die gebruikte geheue egter nie lineêr nie, maar toegewyde chunks is gewoonlik in geskeide posisies van geheue (nie een langs die ander nie) as gevolg van bins en sones wat toewysings volgens grootte skei en omdat vorige vrygemaakte geheue gebruik word voordat nuwe chunks toegewy word. Dit is gekompliseerd om die objek te weet wat gaan bots met die een wat kwesbaar is vir 'n heap overflow. So, wanneer 'n heap overflow gevind word, is dit nodig om 'n betroubare manier te vind om die gewenste objek volgende in geheue te maak van die een wat oorgeloop kan word.

Een van die tegnieke wat hiervoor gebruik word, is Heap Grooming wat byvoorbeeld gebruik word in hierdie pos. In die pos word verduidelik hoe wanneer in die iOS-kern wanneer 'n sone sonder geheue raak om chunks van geheue te stoor, dit dit uitbrei met 'n kernblad, en hierdie blad word in chunks van die verwagte groottes gesplit, wat in volgorde gebruik sal word (tot iOS weergawe 9.2, dan word hierdie chunks op 'n gerandomiseerde manier gebruik om die uitbuiting van hierdie aanvalle te bemoeilik).

Daarom, in die vorige pos waar 'n heap overflow plaasvind, om die oorgeloopde objek te dwing om met 'n slagoffer volgorde te bots, word verskeie kallocs deur verskeie drade gedwing om te probeer verseker dat al die vrye chunks gevul is en dat 'n nuwe blad geskep word.

Om hierdie vul met objek van 'n spesifieke grootte te dwing, is die out-of-line toewysing geassosieer met 'n iOS mach port 'n ideale kandidaat. Deur die grootte van die boodskap te vervaardig, is dit moontlik om die grootte van die kalloc toewysing presies te spesifiseer en wanneer die ooreenstemmende mach port vernietig word, sal die ooreenstemmende toewysing onmiddellik teruggegee word aan kfree.

Dan kan sommige van hierdie plekhouers vrygestel word. Die kalloc.4096 vrye lys stel elemente in 'n laaste-in-eerste-uit volgorde vry, wat basies beteken dat as sommige plekhouers vrygestel word en die uitbuiting probeer om verskeie slagoffer objek te toewys terwyl dit probeer om die objek wat kwesbaar is vir overflow toe te wys, is dit waarskynlik dat hierdie objek gevolg sal word deur 'n slagoffer objek.

Voorbeeld libc

In hierdie bladsy is dit moontlik om 'n basiese Heap overflow emulering te vind wat wys hoe om die prev in gebruik bit van die volgende chunk en die posisie van die prev grootte te oorskry, is dit moontlik om 'n gebruikte chunk te konsolideer (deur dit te laat dink dit is ongebruikte) en dan dit weer toe te wys terwyl dit in staat is om data wat in 'n ander aanwyser gebruik word, ook te oorskry.

'n Ander voorbeeld van protostar heap 0 wys 'n baie basiese voorbeeld van 'n CTF waar 'n heap overflow misbruik kan word om die wenner funksie aan te roep om die vlag te kry.

In die protostar heap 1 voorbeeld is dit moontlik om te sien hoe om 'n buffer overflow te misbruik, is dit moontlik om in 'n naburige chunk 'n adres te oorskry waar arbitraire data van die gebruiker geskryf gaan word.

Voorbeeld ARM64

In die bladsy https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ kan jy 'n heap overflow voorbeeld vind waar 'n opdrag wat uitgevoer gaan word, in die volgende chunk van die oorgeloopde chunk gestoor word. So, dit is moontlik om die uitgevoerde opdrag te verander deur dit te oorskry met 'n maklike uitbuiting soos:

bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt

Ander voorbeelde

  • Auth-or-out. Hack The Box
  • Ons gebruik 'n Integer Overflow kwesbaarheid om 'n Heap Overflow te verkry.
  • Ons korrigeer wysers na 'n funksie binne 'n struct van die oorloopstuk om 'n funksie soos system in te stel en kode-uitvoering te verkry.

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks