.. | ||
ret2lib | ||
ebp2ret-ebp-chaining.md | ||
pointer-redirecting.md | ||
README.md | ||
ret2csu.md | ||
ret2dlresolve.md | ||
ret2esp-ret2reg.md | ||
ret2ret.md | ||
ret2shellcode.md | ||
ret2win.md | ||
rop-return-oriented-programing.md | ||
rop-syscall-execv.md | ||
srop-sigreturn-oriented-programming.md | ||
stack-pivoting-ebp2ret-ebp-chaining.md | ||
stack-shellcode.md |
Stack Overflow
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
What is a Stack Overflow
A stack overflow ni udhaifu unaotokea wakati programu inapoandika data zaidi kwenye stack kuliko ilivyopewa kushikilia. Data hii ya ziada it andika nafasi ya kumbukumbu iliyo karibu, na kusababisha uharibifu wa data halali, kuingiliwa kwa mtiririko wa udhibiti, na kwa uwezekano wa kutekelezwa kwa msimbo mbaya. Tatizo hili mara nyingi linatokea kutokana na matumizi ya kazi zisizo salama ambazo hazifanyi ukaguzi wa mipaka kwenye ingizo.
Tatizo kuu la kuandika tena ni kwamba pointer ya maagizo iliyohifadhiwa (EIP/RIP) na pointer ya msingi iliyohifadhiwa (EBP/RBP) za kurudi kwenye kazi ya awali zime hifadhiwa kwenye stack. Hivyo, mshambuliaji ataweza kuandika tena hizo na kudhibiti mtiririko wa utekelezaji wa programu.
Udhaifu huu kawaida hutokea kwa sababu kazi inakopi ndani ya stack bytes zaidi kuliko kiasi kilichotengwa kwa ajili yake, hivyo kuwa na uwezo wa kuandika tena sehemu nyingine za stack.
Baadhi ya kazi za kawaida zinazoweza kuwa na udhaifu huu ni: strcpy
, strcat
, sprintf
, gets
... Pia, kazi kama fgets
au read
, ambazo zinachukua hoja ya urefu, zinaweza kutumika kwa njia hatarishi ikiwa urefu ulioainishwa 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);
}
Kutafuta Stack Overflows
Njia ya kawaida zaidi ya kutafuta stack overflows ni kutoa ingizo kubwa la A
s (mfano python3 -c 'print("A"*1000)'
) na kutarajia Segmentation Fault
ikionyesha kwamba anwani 0x41414141
ilijaribu kufikiwa.
Zaidi ya hayo, mara tu unapogundua kwamba kuna udhaifu wa Stack Overflow utahitaji kutafuta offset hadi iwezekane kufuta anwani ya kurudi, kwa hili kawaida hutumiwa De Bruijn sequence. Ambayo kwa alfabeti iliyotolewa ya ukubwa k na subsequences za urefu n ni mfuatano wa mzunguko ambapo kila subsequence inayowezekana ya urefu n inaonekana mara moja tu kama subsequence iliyo karibu.
Kwa njia hii, badala ya kuhitaji kubaini ni offset ipi inahitajika kudhibiti EIP kwa mkono, inawezekana kutumia kama padding moja ya hizi sequences na kisha kutafuta offset ya bytes ambazo zilimaliza kufuta 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
Kutumia Stack Overflows
Wakati wa overflow (ikiwa saizi ya overflow ni kubwa vya kutosha) utaweza kuandika upya thamani za mabadiliko ya ndani ya stack hadi kufikia EBP/RBP na EIP/RIP zilizohifadhiwa (au hata zaidi).
Njia ya kawaida zaidi ya kutumia aina hii ya udhaifu ni kwa kubadilisha anwani ya kurudi ili wakati kazi inamalizika mchakato wa udhibiti utaelekezwa popote alipoelekeza mtumiaji katika kiashiria hiki.
Hata hivyo, katika hali nyingine labda tu kuandika upya baadhi ya thamani za mabadiliko katika stack inaweza kuwa ya kutosha kwa matumizi (kama katika changamoto rahisi za CTF).
Ret2win
Katika aina hii ya changamoto za CTF, kuna kazi ndani ya binary ambayo haitaitwa kamwe na ambayo unahitaji kuitwa ili kushinda. Kwa ajili ya changamoto hizi unahitaji tu kupata offset ya kuandika upya anwani ya kurudi na kupata anwani ya kazi ya kuita (kawaida ASLR itakuwa imezimwa) ili wakati kazi iliyo hatarini inarudi, kazi iliyofichwa itaitwa:
{% content-ref url="ret2win.md" %} ret2win.md {% endcontent-ref %}
Stack Shellcode
Katika hali hii mshambuliaji anaweza kuweka shellcode katika stack na kutumia EIP/RIP iliyo na udhibiti kuruka kwenye shellcode na kutekeleza msimbo wowote:
{% content-ref url="stack-shellcode.md" %} stack-shellcode.md {% endcontent-ref %}
ROP
Teknolojia hii ni muundo wa msingi wa kupita ulinzi mkuu wa teknolojia iliyopita: No executable stack (NX). Na inaruhusu kutekeleza mbinu kadhaa nyingine (ret2lib, ret2syscall...) ambazo zitamaliza kwa kutekeleza amri za kawaida kwa kutumia maagizo yaliyopo katika binary:
{% content-ref url="rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}
Aina za ulinzi
Kuna ulinzi kadhaa zinazojaribu kuzuia matumizi ya udhaifu, angalia katika:
{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}
{% hint style="success" %}
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au fuata sisi kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.