hacktricks/binary-exploitation/heap/heap-overflow.md

67 lines
7.3 KiB
Markdown

# Kujaza Kijito
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa kipekee wa [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Taarifa Msingi
Kujaza kijito ni kama [**kujaza steki**](../stack-overflow/) lakini kwenye kijito. Kimsingi inamaanisha kuwa nafasi fulani ilireserviwa kwenye kijito kuhifadhi data fulani na **data iliyohifadhiwa ilikuwa kubwa kuliko nafasi iliyoreserviwa.**
Kwenye kujaza steki tunajua kwamba baadhi ya rejista kama kipima maelekezo au fremu ya steki itarejeshwa kutoka kwenye steki na inaweza kuwa inawezekana kuitumia vibaya hii. Kwenye kujaza kijito, **hakuna habari nyeti iliyohifadhiwa kwa chaguo-msingi** kwenye kipande cha kijito kinachoweza kujazwa. Hata hivyo, inaweza kuwa habari nyeti au viashiria, hivyo **umuhimu** wa udhaifu huu **unategemea** ni **data gani inaweza kubadilishwa** na jinsi mshambuliaji anaweza kutumia hii.
{% hint style="success" %}
Ili kupata vishikizo vya kujaza unaweza kutumia mifano ile ile kama kwenye [**kujaza steki**](../stack-overflow/#kupata-vishikizo-vya-kujaza-steki).
{% endhint %}
### Kujaza Staki vs Kujaza Kijito
Kwenye kujaza steki, upangaji na data ambayo itakuwepo kwenye steki wakati udhaifu unaweza kuzinduliwa ni wa kuaminika kwa kiasi kikubwa. Hii ni kwa sababu steki ni mstari, daima inaongezeka kwa kugongana kwenye kumbukumbu, kwenye **maeneo maalum ya kukimbia kwa programu kumbukumbu ya steki kawaida inahifadhi aina sawa ya data** na ina muundo maalum na viashiria fulani mwishoni mwa sehemu ya steki inayotumiwa na kila kazi.
Hata hivyo, kwenye kujaza kijito, kwa sababu kumbukumbu inayotumiwa si mstari lakini **vipande vilivyotengwa kawaida viko kwenye nafasi tofauti za kumbukumbu** (si moja karibu na nyingine) kwa sababu ya **makorongo na maeneo** yanayotenganisha alokesheni kwa ukubwa na kwa sababu **kumbukumbu iliyotolewa awali inatumika** kabla ya kutenga vipande vipya. Ni **ngumu kujua kitu ambacho kitagongana na kile kilichovunjika** kwa kujaza kijito. Kwa hivyo, unapopata kujaza kijito, ni muhimu kupata **njia ya kuaminika ya kufanya kitu kilichotaka kiwe karibu kwenye kumbukumbu** kutoka kile kinachoweza kujazwa.
Moja ya mbinu zinazotumika kwa hili ni **Kupamba Kijito** ambayo hutumiwa kwa mfano [**kwenye chapisho hili**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). Kwenye chapisho inaelezea jinsi wakati wa kernel wa iOS unapokosa kumbukumbu ya kuhifadhi vipande vya kumbukumbu, inapanua kwa ukurasa wa kernel, na ukurasa huu unagawanywa katika vipande vya ukubwa uliotarajiwa ambavyo vitatumika kwa mpangilio (hadi toleo la iOS 9.2, kisha vipande hivi vinatumika kwa njia iliyochanganywa ili kufanya ugumu wa kudukua mashambulizi haya).
Kwa hivyo, kwenye chapisho la awali ambapo kujaza kijito kinatokea, ili kulazimisha kitu kilichovunjika kigongane na mpangaji, **`kallocs` kadhaa zinalazimishwa na nyuzi kadhaa kujaribu kuhakikisha kuwa vipande vyote vilivyotolewa vimejazwa na ukurasa mpya unatengenezwa**.
Ili kulazimisha kujaza hii na vitu vya ukubwa maalum, **mgawanyo wa nje unaohusishwa na mlango wa iOS mach** ni mgombea bora. Kwa kutengeneza ukubwa wa ujumbe, inawezekana kubainisha ukubwa sahihi wa alokesheni ya `kalloc` na wakati mlango wa mach unaohusika unaharibiwa, alokesheni inayohusiana itaachiliwa mara moja kurudi kwa `kfree`.
Kisha, baadhi ya hizi nafasi zinaweza **kuachiliwa**. **Orodha ya kufungua ya `kalloc.4096` inaachilia vipengele kwa mpangilio wa mwisho kuingia kwanza**, ambayo kimsingi inamaanisha kwamba ikiwa baadhi ya nafasi zimeachiliwa na shambulizi linajaribu kuweka vitu vingi waathiriwa wakati ikijaribu kutenga kitu kilichovunjika, ni uwezekano kwamba kitu hiki kitafuatwa na kitu cha waathiriwa.
### Mfano wa libc
[**Kwenye ukurasa huu**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html) inawezekana kupata uigizaji wa kujaza kijito wa msingi unaonyesha jinsi ya kubadilisha biti ya awali inayotumiwa ya kipande kinachofuata na nafasi ya ukubwa wa awali inawezekana **kuunganisha kipande kilichotumiwa** (kwa kufanya ionekane kama haijatumika) na **kisha kutenga tena** ikiwa inawezekana kubadilisha data inayotumiwa kwenye kielekezi tofauti pia.
Mfano mwingine kutoka [**protostar kijito 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) unaonyesha mfano wa msingi sana wa CTF ambapo **kujaza kijito** inaweza kutumiwa kuita kazi ya mshindi kupata bendera.
Kwenye [**protostar kijito 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html) mfano inawezekana kuona jinsi ya kutumia kujaza kijito niwezekane **kubadilisha kwenye kipande karibu anwani** ambapo **data ya kupendelea kutoka kwa mtumiaji** itaandikwa.
### Mfano wa ARM64
Kwenye ukurasa [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) unaweza kupata mfano wa kujaza kijito ambapo amri itakayotekelezwa imehifadhiwa kwenye kipande kinachofuata kutoka kwenye kipande kilichojazwa. Kwa hivyo, inawezekana kubadilisha amri inayotekelezwa kwa kuibadilisha kwa shambulio rahisi kama:
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
<details>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>