Stack Canaries

unga mkono HackTricks

StackGuard na StackShield

StackGuard inaweka thamani maalum inayoitwa mlinzi kabla ya EIP (Mwongozo wa Maagizo Marefu), kwa usahihi 0x000aff0d (inayowakilisha nukta, mstari mpya, EOF, kurudi nyumbani) kulinda dhidi ya kujaza zaidi ya uwezo wa kibufa. Walakini, kazi kama vile recv(), memcpy(), read(), na bcopy() bado ziko hatarini, na haitoi ulinzi kwa EBP (Mwongozo wa Msingi).

StackShield inachukua njia yenye utata zaidi kuliko StackGuard kwa kudumisha Global Return Stack, ambayo hifadhi anwani zote za kurudi (EIPs). Hii inahakikisha kwamba kujaza zaidi haisababishi madhara, kwani inaruhusu kulinganisha kati ya anwani zilizohifadhiwa na anwani 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 kwamba StackShield pia haitoi ulinzi kwa mchanganyiko wa ndani.

Mlinzi wa Stack Smash (ProPolice) -fstack-protector:

Mbinu hii inaweka mlinzi kabla ya EBP, na kurekebisha upya mchanganyiko wa ndani ili kuweka mabufa kwenye anwani za kumbukumbu za juu, kuzuia kuzidiwa kwa mabufa mengine. Pia inakopi salama hoja zilizopitishwa kwenye mstari juu ya mabufa ya ndani na kutumia nakala hizi kama hoja. Walakini, haitoi ulinzi kwa mizunguko yenye vipengee chini ya vipengee 8 au mabufa ndani ya muundo wa mtumiaji.

Mlinzi ni nambari ya nasibu inayotokana na /dev/urandom au thamani ya msingi ya 0xff0a0000. Imehifadhiwa katika TLS (Uhifadhi wa Mada wa Wateja), ikiruhusu nafasi za kumbukumbu zilizoshirikiwa kati ya mchakato kuwa na vipengee vya kimataifa au vya msingi vya wateja. Vipengee hivi kwanza vinakopiwa kutoka kwa mchakato mzazi, na michakato ya watoto inaweza kubadilisha data yao bila kuathiri mzazi au ndugu. Walakini, ikiwa fork() inatumika bila kuunda mlinzi mpya, michakato yote (mzazi na watoto) wanashiriki mlinzi sawa, ikifanya iwe hatarini. Kwenye usanifu wa i386, mlinzi hufungwa kwa gs:0x14, na kwenye x86_64, kwa fs:0x28.

Ulinzi huu wa ndani unatambua kazi zenye mabufa yanayoweza kushambuliwa na kuingiza nambari mwanzoni mwa kazi hizi kuweka mlinzi, na mwishoni kuhakiki usahihi wake.

Wakati seva ya wavuti inatumia fork(), inawezesha shambulio la kufikiria kwa kuhadithiwa mlinzi kwa kila baiti. Walakini, kutumia execve() baada ya fork() kunafuta nafasi ya kumbukumbu, kufuta shambulio. vfork() inaruhusu mchakato wa mtoto kutekeleza bila kuiga hadi jaribio la kuandika, wakati huo mchakato wa nakala unajengwa, kutoa njia tofauti ya uundaji wa mchakato na utunzaji wa kumbukumbu.

Urefu

Katika programu za x64, kuki ya mlinzi 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 mlinzi ni baiti ya dword ya 0x4. Baiti tatu za kwanza ni za nasibu na baiti ya mwisho ni baiti ya null.

Baiti ya kufikia ya chini ya mlinzi wa kila mlinzi 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.

Kupitisha

Kuvuja kwa mlinzi na kisha kuiandika (k.m. kujaza zaidi ya kibufa) na thamani yake mwenyewe.

  • Ikiwa mlinzi anahadithiwa katika michakato ya watoto inaweza kuwa inawezekana kuihakiki kwa nguvu baiti moja kwa wakati:

  • Ikiwa kuna kuvuja kwa kuvutia au udhaifu wa kusoma wa kiholela katika faili ya binari inaweza kuwa inawezekana kuvuja:

  • Kuiandika upya pointi zilizohifadhiwa kwenye stakishi

Stakishi inayoweza kushambuliwa na kujaza zaidi ya stakishi inaweza kuwa na anwani za herufi au kazi ambazo zinaweza kuandikwa upya ili kutumia udhaifu bila kuhitaji kufikia mlinzi wa stakishi. Angalia:

  • Kurekebisha mlinzi wa bwana na wa mnyororo

Kujaza zaidi kwenye kazi iliyolindwa na mlinzi inaweza kutumika kurekebisha mlinzi wa bwana wa mnyororo wa mnyororo. Kama matokeo, kinga inakuwa bure kwa sababu ukaguzi unatumia mlinzi wawili ambao ni sawa (ingawa wamebadilishwa).

Zaidi ya hayo, kujaza zaidi kwenye kazi iliyolindwa na mlinzi inaweza kutumika kurekebisha mlinzi wa bwana uliohifadhiwa katika TLS. Hii ni kwa sababu, inaweza kuwa inawezekana kufikia nafasi ya kumbukumbu ambapo TLS inahifadhiwa (na kwa hivyo, mlinzi) kupitia bof kwenye stakishi ya mnyororo. Kama matokeo, kinga inakuwa bure kwa sababu ukaguzi unatumia mlinzi wawili ambao ni sawa (ingawa wamebadilishwa). Shambulio hili linafanywa katika andiko: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads

Angalia pia mawasilisho ya https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 ambayo inataja kwamba kawaida TLS inahifadhiwa na mmap na wakati stakishi ya mnyororo inaundwa pia inazalishwa na mmap kulingana na hii, ambayo inaweza kuruhusu kujaza kama ilivyoonyeshwa katika andiko la awali.

  • Badilisha kuingia cha GOT cha __stack_chk_fail

Ikiwa faili ya binari ina Partial RELRO, basi unaweza kutumia andishi la kiholela kurekebisha kuingia cha GOT cha __stack_chk_fail kuwa kazi bandia ambayo haizuizi programu ikiwa mlinzi unabadilishwa.

Shambulio hili linafanywa katika andiko: https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/

Marejeo

Support HackTricks

Last updated