Stack Canaries
Last updated
Last updated
Jifunze na zoezi la AWS Hacking:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze na zoezi la GCP Hacking: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)
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.
-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.
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.
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/
Jifunze na zoezi la Kuvamia AWS:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze na zoezi la Kuvamia GCP: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)