6.4 KiB
Kujaa 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 USAJILI!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs za kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Ni Nini Kujaa Kwa Stack
Kujaa kwa stack overflow ni udhaifu unapotokea programu inapoandika 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 utekelezaji wa nambari yenye nia mbaya. Tatizo hili mara nyingi hutokea kutokana na matumizi ya kazi zisizo salama ambazo hazifanyi ukaguzi wa mipaka kwenye data zinazoingia.
Tatizo kuu la kufuta 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 ya idadi iliyotengewa, hivyo kuweza kufuta sehemu nyingine za stack.
Baadhi ya kazi za kawaida zenye 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:
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 kwa Stack
Njia ya kawaida ya kupata vipande vya kuzidi kwa stack ni kutoa kuingia kubwa sana la A
(k.m. python3 -c 'print("A"*1000)'
) na kutarajia Segmentation Fault
inayoashiria kwamba anwani 0x41414141
ilijaribiwa kufikiwa.
Zaidi ya hayo, mara baada ya kugundua kuwa kuna udhaifu wa Kuzidi kwa Stack, utahitaji kupata vipande vya kuzidi 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 vipande vya urefu _n_** vinatokea mara moja tu** kama mfululizo unaofuatana.
Hivyo, badala ya kuhitaji kufikiria ni vipande vipi vinahitajika kudhibiti EIP kwa mkono, ni rahisi kutumia mojawapo ya mfululizo huu kama kujaza na kisha kupata vipande vya kuzidi ambavyo vilimaliza kubadilisha hiyo.
Inawezekana kutumia pwntools kwa hili:
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:
#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, mtiririko wa udhibiti utaelekezwa mahali ambapo mtumiaji alipendekeza katika kidude hiki.
Hata hivyo, katika hali nyingine labda tu kubadilisha thamani za baadhi ya mchanganyiko wa stack inaweza kuwa ya kutosha kwa udanganyifu (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 simu ili ushinde. Kwa changamoto hizi, unahitaji tu kupata kielezo cha kubadilisha anwani ya kurudi na kupata anwani ya kazi ya kupiga simu (kawaida ASLR itakuwa imelemazwa) hivyo wakati kazi yenye udhaifu inaporudi, kazi iliyofichwa itaitwa:
{% content-ref url="ret2win/" %} ret2win {% 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/" %} stack-shellcode {% endcontent-ref %}
ROP & Mbinu za Ret2...
Mbinu hii ni mfumo msingi wa kuzidi kinga kuu kwa mbinu ya awali: Stack isiyoweza kutekelezwa (NX). Na inaruhusu kutekeleza mbinu kadhaa (ret2lib, ret2syscall...) ambazo mwishowe zitakamilisha kutekeleza amri za aina yoyote kwa kudanganya maagizo yaliyopo kwenye binary:
{% content-ref url="../rop-return-oriented-programing/" %} rop-return-oriented-programing {% endcontent-ref %}
Mabaki ya Heap
Kudukua sio lazima iwe kwenye stack, inaweza pia kuwa kwenye heap kwa mfano:
{% content-ref url="../heap/heap-overflow.md" %} heap-overflow.md {% endcontent-ref %}
Aina za kinga
Kuna kinga kadhaa zinajaribu kuzuia kutumia udhaifu, zitazame hapa:
{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}