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

7 KiB

Mlinzi wa Stack

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na htARTE (Mtaalamu wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

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 kukufikiria baiti moja kwa wakati:

{% content-ref url="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 {% 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 {% 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

  • 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/

Marejeo