hacktricks/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/README.md

85 lines
7 KiB
Markdown

# Mlinzi wa Stack
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalamu 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) github repos.
</details>
## **StackGuard na StackShield**
**StackGuard** inaweka thamani maalum inayoitwa **canary** kabla ya **EIP (Mpokeaji wa Maagizo ya Kuongezwa)**, kwa usahihi `0x000aff0d` (inayowakilisha nukta, mstari mpya, EOF, kurudi nyumbani) kulinda dhidi ya kujaza zaidi ya uwezo wa kibafu. Walakini, kazi kama vile `recv()`, `memcpy()`, `read()`, na `bcopy()` bado ziko hatarini, na haitoi ulinzi kwa **EBP (Mpokeaji wa Msingi)**.
**StackShield** inachukua njia yenye utata zaidi kuliko StackGuard kwa kudumisha **Global Return Stack**, ambayo hifadhi anwani zote za kurudi (**EIPs**). Hii inahakikisha kuwa kujaza zaidi haisababishi madhara, kwani inaruhusu kulinganisha kati ya anwani za kurudi zilizohifadhiwa na zile halisi za kurudi kugundua matukio ya kujaza zaidi. Kwa kuongezea, StackShield inaweza kuchunguza anwani ya kurudi dhidi ya thamani ya mpaka kugundua ikiwa **EIP** inaelekeza nje ya nafasi ya data inayotarajiwa. Walakini, ulinzi huu unaweza kuzungukwa kupitia mbinu kama Return-to-libc, ROP (Return-Oriented Programming), au ret2ret, ikionyesha kuwa StackShield pia haikilindi mchanganyiko wa ndani.
## **Mlinzi wa Kupasuka wa Stack (ProPolice) `-fstack-protector`:**
Mbinu hii inaweka **canary** kabla ya **EBP**, na kurekebisha upya mibofu ya ndani ili kuweka mabafu kwenye anwani za kumbukumbu za juu, kuzuia kuzidiwa kwa mibofu mingine. Pia inakopi salama hoja zilizopitishwa kwenye mstari juu ya mibofu ya ndani na kutumia nakala hizi kama hoja. Walakini, haitoi ulinzi kwa mizunguko yenye vipengele chini ya vipengele 8 au mibofu ndani ya muundo wa mtumiaji.
**Canary** ni nambari ya nasibu inayotokana na `/dev/urandom` au thamani ya msingi ya `0xff0a0000`. Imehifadhiwa katika **TLS (Uhifadhi wa Mada za Wateja)**, ikiruhusu nafasi za kumbukumbu zilizoshirikiwa kati ya mchakato kuwa na mali za ulimwengu au za kudumu za mada. Mali hizi kwa kawaida hukopiwa kutoka kwa mchakato mzazi, na michakato ya watoto inaweza kubadilisha data yao bila kuathiri mzazi au ndugu. Walakini, ikiwa **`fork()` inatumika bila kuunda canary mpya, michakato yote (mzazi na watoto) wanashiriki canary sawa**, ikifanya iwe hatarini. Kwenye usanifu wa **i386**, canary imehifadhiwa kwa `gs:0x14`, na kwenye **x86\_64**, kwa `fs:0x28`.
Ulinzi huu wa ndani unatambua kazi zenye mibofu inayoweza kushambuliwa na kuingiza nambari mwanzoni mwa kazi hizi kuweka canary, na mwishoni kudhibitisha usahihi wake.
Wakati seva ya wavuti inatumia `fork()`, inawezesha shambulio la kufikiria kuhusu canary kwa kila baiti. Walakini, kutumia `execve()` baada ya `fork()` kunaharibu nafasi ya kumbukumbu, kufuta shambulio. `vfork()` inaruhusu mchakato wa mtoto kutekelezwa bila kuiga hadi jaribio la kuandika, wakati huo nakala inaundwa, kutoa njia tofauti ya uundaji wa mchakato na utunzaji wa kumbukumbu.
### Urefu
Katika programu za `x64`, kuki ya canary ni **baiti ya qword ya `0x8`**. **Baiti saba za kwanza ni za nasibu** na baiti ya mwisho ni **baiti ya null.**
Katika programu za `x86`, kuki ya canary ni **baiti ya dword ya `0x4`**. **Baiti tatu za kwanza ni za nasibu** na baiti ya mwisho ni **baiti ya null.**
{% hint style="hatari" %}
Baiti ya chini zaidi ya canaries zote ni baiti ya null kwa sababu itakuwa ya kwanza kwenye stakishi ikitoka kwenye anwani za chini na kwa hivyo **kazi zinazosoma herufi zitasimama kabla ya kuisoma**.
{% endhint %}
## Kupitisha
**Kuvuja kwa canary** na kisha kuibadilisha (k.m. kujaza zaidi ya uwezo) na thamani yake yenyewe.
* Ikiwa **canary inaundwa katika michakato ya watoto** inaweza kuwa inawezekana ku**kufikiria** baiti moja kwa wakati:
{% content-ref url="bf-forked-stack-canaries.md" %}
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
{% endcontent-ref %}
* Ikiwa kuna **kuvuja kwa kuvutia au kuvuja kwa kusoma kwa hiari** katika binary inaweza kuwa inawezekana kuvuja:
{% content-ref url="print-stack-canary.md" %}
[print-stack-canary.md](print-stack-canary.md)
{% endcontent-ref %}
* **Kuibadilisha pointi zilizohifadhiwa kwenye stakishi**
Stakishi inayoweza kushambuliwa na kujaza zaidi ya stakishi inaweza **kuwa na anwani za herufi au kazi ambazo zinaweza kubadilishwa** ili kutumia udhaifu bila kuhitaji kufikia canary ya stakishi. Angalia:
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
{% endcontent-ref %}
* **Kurekebisha canary ya bwana na mnyororo**
Kujaza zaidi katika kazi iliyolindwa na canary inaweza kutumika **kurekebisha canary ya bwana wa mnyororo**. Kama matokeo, kinga inakuwa bure kwa sababu ukaguzi unatumia canaries mbili ambazo ni sawa (ingawa zimebadilishwa).
Shambulio hili linafanywa katika andiko: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
* **Badilisha kuingia cha GOT cha `__stack_chk_fail`**
Ikiwa binary ina Partial RELRO, basi unaweza kutumia andishi la hiari kurekebisha **kuingia cha GOT cha `__stack_chk_fail`** kuwa kazi bandia ambayo haizuizi programu ikiwa canary inabadilishwa.
Shambulio hili linafanywa katika andiko: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
## Marejeo
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
* [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
* **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.**