.. | ||
ret2lib | ||
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 |
स्टैक ओवरफ्लो
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS और HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs संग्रह The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @hacktricks_live** पर फॉलो** करें।
- अपने हैकिंग ट्रिक्स साझा करें द्वारा PRs सबमिट करके HackTricks और HackTricks Cloud github repos.
स्टैक ओवरफ्ल क्या है
एक स्टैक ओवरफ्लो एक सुरक्षा दोष है जो उस समय होता है जब एक प्रोग्राम स्टैक में अधिक डेटा लिखता है जितना इसे धारित किया गया है। यह अतिरिक्त डेटा पड़ोसी मेमोरी स्थान को अधिक लिखेगा, जिससे मान्य डेटा का क्षति होगा, नियंत्रण प्रवाह विघटन होगा, और संभावित रूप से दुर्भाग्यपूर्ण कोड का क्रियान्वयन। यह समस्या अक्सर असुरक्षित फ़ंक्शनों का उपयोग करने के कारण उत्पन्न होती है जो इनपुट पर सीमा की जांच नहीं करते।
इस ओवरराइट की मुख्य समस्या यह है कि EIP और EBP प्वाइंटर पिछले फ़ंक्शन में वापस जाने के लिए स्टैक में संग्रहीत होते हैं। इसलिए, एक हमलावियक्ता उन्हें ओवरराइट कर सकेगा और प्रोग्राम के निष्पादन प्रवाह को नियंत्रित कर सकेगा।
यह सुरक्षा दोष आम तौर पर उत्पन्न होता है क्योंकि एक फ़ंक्शन स्टैक में उससे अधिक बाइट कॉपी करता है जितना इसके लिए आवंटित किया गया है, इसलिए वह स्टैक के अन्य हिस्सों को ओवरराइट कर सकता है।
कुछ सामान्य फ़ंक्शन जो इसमें वंशबद्ध हो सकते हैं हैं: strcpy
, strcat
, sprintf
, gets
, fgets
...
उदाहरण के लिए, निम्नलिखित फ़ंक्शन वंशबद्ध हो सकते हैं:
void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
तुकड़ों को खोजना
स्टैक ओवरफ्लो को खोजने का सबसे सामान्य तरीका बहुत बड़े इनपुट A
का देना है (जैसे python3 -c 'print("A"*1000)'
) और Segmentation Fault
की उम्मीद है जिससे पता चलता है कि पता चला कि पता चला कि 0x41414141 का पता लगाने की कोशिश की गई थी।
इसके अतिरिक्त, एक बार जब आपने पाया है कि स्टैक ओवरफ्लो संवर्धनशीलता है, तो आपको उस समय तक का अफसोस खोजना होगा जब तक EIP पॉइंटर को अधिलेखित करना संभव हो। इसके लिए आम तौर पर डी ब्रुइन सीक्वेंस का उपयोग किया जाता है। जो एक दिए गए वर्णमाला के आकार k और लंबाई n के उपक्रमों के लिए एक चक्रीय क्रम है जिसमें हर संभावित उपक्रम लंबाई n का एक बार एक साथ दिखाई देता है जैसे कि एक संयुक्त उपक्रम।
इस तरह, हैंड से EIP को अधिलेखित करने वाले ऑफसेट को खोजने की आवश्यकता नहीं होती है, इसे एक इनकार के रूप में उपयोग करना संभव है और फिर उस बाइट्स के ऑफसेट को खोजना संभव है जिन्होंने इसे अधिलेखित कर दिया।
इसका उपयोग करना संभव है pwntools के लिए:
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}")
या 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
स्टैक ओवरफ्लो का शोषण
ओवरफ्लो के दौरान (यदि ओवरफ्लो का आकार पर्याप्त बड़ा हो) आप स्टैक के अंदर अन्य चरों के मानों को अधिक कर सकते हैं जब तक EBP और EIP (या और भी अधिक) तक न पहुंच जाएं।
इस प्रकार की सुरक्षा की इस प्रकार की दुरुपयोग करने का सबसे सामान्य तरीका है EIP पॉइंटर को संशोधित करना ताकि जब फ़ंक्शन समाप्त होता है, नियंत्रण प्रवाह उस स्थान पर पुनर्निर्देशित हो जाए जहां उपयोगकर्ता ने इस पॉइंटर में निर्दिष्ट किया है।
हालांकि, अन्य परिदृश्यों में शायद केवल स्टैक में कुछ चरों के मानों को अधिक करना ही उत्पीड़न के लिए पर्याप्त हो सकता है (जैसे कि आसान CTF चुनौतियों में)।
Ret2win
इस प्रकार की CTF चुनौतियों में, बाइनरी के अंदर एक फ़ंक्शन होता है जो कभी नहीं बुलाया जाता और जिसे आपको जीतने के लिए बुलाना होगा। इन चुनौतियों में आपको बस EIP को अधिक करने के लिए ऑफसेट खोजना होगा और फ़ंक्शन का पता लगाना होगा (सामान्यत: ASLR अक्षम होगा) ताकि जब संकटपूर्ण फ़ंक्शन वापस लौटता है, छुपा हुआ फ़ंक्शन बुलाया जाएगा:
{% content-ref url="ret2win.md" %} ret2win.md {% endcontent-ref %}
स्टैक शेलकोड
इस परिदृश्य में हमलावर एक शेलकोड को स्टैक में रख सकता है और नियंत्रित EIP का दुरुपयोग करके शेलकोड पर जाने और हमलावर कोड को निष्पादित करने के लिए उपयोग कर सकता है:
{% content-ref url="stack-shellcode.md" %} stack-shellcode.md {% endcontent-ref %}
ROP
यह तकनीक पिछली तकनीक को अग्रणी सुरक्षा को छोड़ने के लिए मुख्य सुरक्षा को छलने के लिए मौलिक ढांचा है: कोई क्रियात्मक स्टैक। और यह बाइनरी में मौजूद निर्देशिकाओं का दुरुपयोग करके विभिन्न अन्य तकनीकों को क्रियान्वित करने की अनुमति देता है (ret2lib, ret2syscall...) जो विचारहीन आदेशों को निष्पादित करने के लिए अर्बिट्रेट कमांड करने की अनुमति देता है:
{% content-ref url="rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}
सुरक्षा के प्रकार
कई सुरक्षा प्रकार हैं जो दुर्भाग्यता का शोषण रोकने का प्रयास कर रहे हैं, उन्हें जांचें:
{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}