# Kuzidi Kwa Stack
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)! Njia nyingine za kusaidia HackTricks: * Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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 [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee * **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) repos za github.
## Ni Nini Stack Overflow **Kuzidi kwa stack** ni udhaifu unapotokea wakati programu inaandika data zaidi kwenye stack kuliko ilivyotengewa kuhifadhi. Data hii ya ziada ita **zifuta nafasi ya kumbukumbu inayopakana**, ikisababisha uharibifu wa data halali, kuvuruga mtiririko wa udhibiti, na kwa uwezekano wa kutekeleza msimbo wa kudhuru. Tatizo hili mara nyingi hutokea kutokana na matumizi ya kazi zisizo salama ambazo hazifanyi ukaguzi wa mipaka kwenye data zinazoingia. Tatizo kuu la kuzidi huku ni kwamba **ishara iliyohifadhiwa ya maagizo (EIP/RIP)** na **ishara iliyohifadhiwa ya msingi (EBP/RBP)** ya kurudi kwenye kazi iliyotangulia zinahifadhiwa kwenye stack. Hivyo basi, mshambuliaji ataweza kuzifuta hizo na **kudhibiti mtiririko wa utekelezaji wa programu**. Udhaifu huu kawaida hutokea kwa sababu kazi **inafanya nakala ndani ya stack ya herufi zaidi kuliko kiasi kilichotengwa kwa ajili yake**, hivyo kuweza kuzifuta sehemu nyingine za stack. Baadhi ya kazi za kawaida zinazoweza kuwa na udhaifu huu ni: **`strcpy`, `strcat`, `sprintf`, `gets`**... Pia, kazi kama **`fgets`**, **`read` & `memcpy`** ambazo zinachukua **hoja ya urefu**, zinaweza kutumika kwa njia yenye udhaifu ikiwa urefu uliotajwa ni mkubwa kuliko ule uliotengwa. Kwa mfano, kazi zifuatazo zinaweza kuwa na udhaifu: ```c void vulnerable() { char buffer[128]; printf("Enter some text: "); gets(buffer); // This is where the vulnerability lies printf("You entered: %s\n", buffer); } ``` ### Kupata Vipande vya Kuzidi Kwenye Stack Njia ya kawaida ya kupata vipande vya kuzidi kwenye stack ni kutoa kuingia kikubwa sana cha `A` (k.m. `python3 -c 'print("A"*1000)'`) na kutarajia `Segmentation Fault` inayoashiria kwamba **anwani `0x41414141` ilijaribiwa kupatikana**. Zaidi ya hayo, mara baada ya kugundua kuwepo kwa udhaifu wa Kuzidi Kwenye Stack, utahitaji kupata kipande hadi iwezekane kubadilisha **anwani ya kurudi**, kwa hili kawaida hutumika **Mfululizo wa De Bruijn.** Ambao kwa alfabeti iliyopewa ya ukubwa _k_ na vipande vya urefu _n_ ni **mfululizo wa mzunguko ambapo kila kipande kinachowezekana cha urefu \_n**\_\*\* kinatokea mara moja tu\*\* kama kipande kinachofuatana. Hivyo, badala ya kuhitaji kufikiria ni kipande gani kinahitajika kudhibiti EIP kwa mkono, ni rahisi kutumia mojawapo ya mfululizo huu kama kujaza na kisha kupata kipande cha herufi kilichomaliza kubadilisha. Inawezekana kutumia **pwntools** kwa hili: ```python from pwn import * # Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values) pattern = cyclic(1000) # This is an example value that you'd have found in the EIP/IP register upon crash eip_value = p32(0x6161616c) offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern print(f"The offset is: {offset}") ``` au **GEF**: ```bash #Patterns pattern create 200 #Generate length 200 pattern pattern search "avaaawaa" #Search for the offset of that substring pattern search $rsp #Search the offset given the content of $rsp ``` ## Kudukua Mabaki ya Stack Wakati wa kudukua (ukiwa na ukubwa wa kutosha), utaweza **kubadilisha** thamani za mchanganyiko wa ndani wa stack hadi kufikia **EBP/RBP na EIP/RIP zilizohifadhiwa (au hata zaidi)**.\ Njia ya kawaida ya kutumia udhaifu huu ni kwa **kubadilisha anwani ya kurudi** ili wakati wa kumalizika kwa kazi, **mkondo wa udhibiti utaelekezwa mahali ambapo mtumiaji alipendekeza** katika kidude hiki. Hata hivyo, katika mazingira mengine labda **kubadilisha thamani za baadhi ya mchanganyiko wa stack** inaweza kuwa ya kutosha kwa kudukua (kama katika changamoto rahisi za CTF). ### Ret2win Katika aina hii ya changamoto za CTF, kuna **kazi** **ndani** ya binary ambayo **haijawahi kuitwa** na **unahitaji kuipiga ili kushinda**. Kwa changamoto hizi unahitaji tu kupata **kielelezo cha kubadilisha anwani ya kurudi** na **kupata anwani ya kazi** ya kupiga simu (kawaida [**ASLR**](../common-binary-protections-and-bypasses/aslr/) itakuwa imelemazwa) hivyo wakati kazi yenye udhaifu inaporudi, kazi iliyofichwa itaitwa: {% content-ref url="ret2win.md" %} [ret2win.md](ret2win.md) {% endcontent-ref %} ### Shellcode ya Stack Katika hali hii, mkaidi anaweza kuweka shellcode kwenye stack na kutumia EIP/RIP iliyodhibitiwa kuruka kwenye shellcode na kutekeleza kanuni za aina yoyote: {% content-ref url="stack-shellcode.md" %} [stack-shellcode.md](stack-shellcode.md) {% endcontent-ref %} ### ROP & Mbinu za Ret2... Mbinu hii ni mfumo msingi wa kukiuka kinga kuu kwa mbinu iliyotangulia: **Stack isiyoweza kutekelezwa (NX)**. Na inaruhusu kutekeleza mbinu kadhaa zingine (ret2lib, ret2syscall...) ambazo mwishowe zitakamilisha kutekeleza amri za aina yoyote kwa kudhuru maagizo yaliyopo kwenye binary: {% content-ref url="../rop-return-oriented-programing/" %} [rop-return-oriented-programing](../rop-return-oriented-programing/) {% endcontent-ref %} ## Aina za kinga Kuna kinga kadhaa zinazojaribu kuzuia kudukua kwa udhaifu, zitazame hapa: {% content-ref url="../common-binary-protections-and-bypasses/" %} [common-binary-protections-and-bypasses](../common-binary-protections-and-bypasses/) {% endcontent-ref %}