Stack Canaries

StackGuard inaweka thamani maalum inayoitwa canary kabla ya EIP (Extended Instruction Pointer), kwa usahihi 0x000aff0d (inawakilisha null, newline, EOF, carriage return) kulinda dhidi ya buffer overflows. Walakini, kazi kama vile recv(), memcpy(), read(), na bcopy() bado ziko hatarini, na haitilindi EBP (Base Pointer).

StackShield inachukua njia yenye utata zaidi kuliko StackGuard kwa kudumisha Global Return Stack, ambayo hifadhi anwani zote za kurudi (EIPs). Hii inahakikisha kuwa kuzidi kwa kiasi chochote hakusababishi madhara, kwani inaruhusu kulinganisha kati ya anwani zilizohifadhiwa na anwani halisi za kurudi ili kugundua matukio ya kuzidi. Kwa kuongezea, StackShield inaweza kuchunguza anwani ya kurudi dhidi ya thamani ya mpaka ili 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 haitilindi variables za ndani.

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

Mbinu hii huiweka canary kabla ya EBP, na kurekebisha upya variables za ndani ili kuweka buffers kwenye anwani za kumbukumbu za juu, kuzuia kuzipitisha variables nyingine. Pia inakopi salama hoja zilizopitishwa kwenye stack juu ya variables za ndani na kutumia nakala hizi kama hoja. Walakini, haitilindi arrays zenye vipengele chini ya 8 au buffers ndani ya muundo wa mtumiaji.

Canary ni nambari ya nasibu inayotokana na /dev/urandom au thamani ya msingi ya 0xff0a0000. Imehifadhiwa katika TLS (Thread Local Storage), ikiruhusu nafasi za kumbukumbu zilizoshirikiwa kati ya threads kuwa na variables za ulimwengu au za static za thread. Variables hizi kwanza 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 buffers zinazoweza kushambuliwa na kuingiza nambari mwanzoni mwa kazi hizi kuweka canary, na mwishoni kuhakiki usahihi wake.

Uvukaji

Kuvuja kwa canary na kisha kuibadilisha (k.m. buffer overflow) na thamani yake mwenyewe.

  • Ikiwa canary inaforked katika michakato ya watoto inaweza kuwa inawezekana kuibadilisha kibayeti kwa kila wakati:

  • Ikiwa kuna kuvuja kwa kuvutia au kusoma kwa ujanja katika binary inaweza kuwa inawezekana kuvuja:

  • Kuibadilisha pointers zilizohifadhiwa kwenye stack

Stack inayoweza kushambuliwa na stack overflow inaweza kuwa na anwani za strings au kazi ambazo zinaweza kubadilishwa ili kutumia udhaifu bila kuhitaji kufikia canary ya stack. Angalia:

  • Kurekebisha maelezo ya GOT ya __stack_chk_fail

Ikiwa binary ina Partial RELRO, basi unaweza kutumia andika ya kiholela kurekebisha maelezo ya GOT ya __stack_chk_fail kuwa kazi bandia ambayo haizuizi programu ikiwa canary inabadilishwa.

Marejeo

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated