Stack Overflow
What is a Stack Overflow
एक स्टैक ओवरफ्लो एक सुरक्षा कमजोरी है जो तब होती है जब एक प्रोग्राम स्टैक में उस डेटा से अधिक डेटा लिखता है जो इसे रखने के लिए आवंटित किया गया है। यह अतिरिक्त डेटा सन्निहित मेमोरी स्थान को ओवरराइट करेगा, जिससे वैध डेटा का भ्रष्टाचार, नियंत्रण प्रवाह में बाधा, और संभावित रूप से दुर्भावनापूर्ण कोड का निष्पादन हो सकता है। यह समस्या अक्सर असुरक्षित कार्यों के उपयोग के कारण उत्पन्न होती है जो इनपुट पर सीमा जांच नहीं करती हैं।
इस ओवरराइट की मुख्य समस्या यह है कि सहेजा गया निर्देश सूचकांक (EIP/RIP) और सहेजा गया आधार सूचकांक (EBP/RBP) जो पिछले कार्य में लौटने के लिए हैं, स्टैक पर संग्रहीत होते हैं। इसलिए, एक हमलावर उन्हें ओवरराइट करने में सक्षम होगा और प्रोग्राम के निष्पादन प्रवाह को नियंत्रित कर सकेगा।
यह सुरक्षा कमजोरी आमतौर पर इसलिए उत्पन्न होती है क्योंकि एक कार्य स्टैक के अंदर आवंटित मात्रा से अधिक बाइट्स की कॉपी करता है, जिससे यह स्टैक के अन्य भागों को ओवरराइट करने में सक्षम होता है।
इससे प्रभावित कुछ सामान्य कार्य हैं: strcpy
, strcat
, sprintf
, gets
... इसके अलावा, fgets
, read
& memcpy
जैसे कार्य जो लंबाई तर्क लेते हैं, यदि निर्दिष्ट लंबाई आवंटित से अधिक है तो कमजोर तरीके से उपयोग किए जा सकते हैं।
उदाहरण के लिए, निम्नलिखित कार्य कमजोर हो सकते हैं:
Stack Overflows के ऑफसेट्स खोजना
Stack overflows खोजने का सबसे सामान्य तरीका A
s का बहुत बड़ा इनपुट देना है (जैसे python3 -c 'print("A"*1000)'
) और एक Segmentation Fault
की उम्मीद करना जो यह संकेत करता है कि पता 0x41414141
को एक्सेस करने की कोशिश की गई थी।
इसके अलावा, एक बार जब आप यह पता लगा लेते हैं कि Stack Overflow की कमजोरी है, तो आपको यह पता लगाने की आवश्यकता होगी कि रिटर्न एड्रेस को ओवरराइट करने के लिए कितना ऑफसेट चाहिए, इसके लिए आमतौर पर एक De Bruijn अनुक्रम का उपयोग किया जाता है। जो एक दिए गए वर्णमाला के आकार k और लंबाई n के उप अनुक्रमों के लिए एक चक्रीय अनुक्रम है जिसमें लंबाई _n_** के हर संभव उप अनुक्रम** ठीक एक बार** एक सन्निकट उप अनुक्रम के रूप में प्रकट होता है।
इस तरह, EIP को नियंत्रित करने के लिए आवश्यक ऑफसेट को हाथ से पता लगाने के बजाय, इन अनुक्रमों में से एक को पैडिंग के रूप में उपयोग करना संभव है और फिर उन बाइट्स का ऑफसेट ढूंढना संभव है जो इसे ओवरराइट करने के अंत में हैं।
इसके लिए pwntools का उपयोग करना संभव है:
या GEF:
स्टैक ओवरफ्लोज़ का शोषण
एक ओवरफ्लो के दौरान (मान लेते हैं कि ओवरफ्लो का आकार पर्याप्त बड़ा है) आप स्टैक के अंदर स्थानीय चर के मानों को ओवरराइट करने में सक्षम होंगे जब तक कि सहेजे गए EBP/RBP और EIP/RIP (या इससे भी अधिक) तक नहीं पहुँच जाते। इस प्रकार की भेद्यता का दुरुपयोग करने का सबसे सामान्य तरीका रिटर्न पते को संशोधित करना है ताकि जब फ़ंक्शन समाप्त हो, तो नियंत्रण प्रवाह उस पते पर पुनर्निर्देशित किया जाएगा जो उपयोगकर्ता ने निर्दिष्ट किया है।
हालांकि, अन्य परिदृश्यों में केवल स्टैक में कुछ चर के मानों को ओवरराइट करना शोषण के लिए पर्याप्त हो सकता है (जैसे आसान CTF चुनौतियों में)।
Ret2win
इस प्रकार की CTF चुनौतियों में, बाइनरी के अंदर एक फंक्शन है जो कभी नहीं बुलाया जाता और जिसे आपको जीतने के लिए बुलाना होगा। इन चुनौतियों के लिए आपको केवल रिटर्न पते को ओवरराइट करने के लिए ऑफसेट खोजने की आवश्यकता है और बुलाने के लिए फंक्शन का पता लगाना है (आमतौर पर ASLR अक्षम होगा) ताकि जब कमजोर फ़ंक्शन लौटे, तो छिपा हुआ फ़ंक्शन बुलाया जाएगा:
Ret2winस्टैक शेलकोड
इस परिदृश्य में हमलावर स्टैक में एक शेलकोड रख सकता है और नियंत्रित EIP/RIP का दुरुपयोग करके शेलकोड पर कूद सकता है और मनचाहा कोड निष्पादित कर सकता है:
Stack ShellcodeROP & Ret2... तकनीकें
यह तकनीक पिछले तकनीक के मुख्य सुरक्षा को बायपास करने के लिए मौलिक ढांचा है: नो एक्सीक्यूटेबल स्टैक (NX)। और यह कई अन्य तकनीकों (ret2lib, ret2syscall...) को निष्पादित करने की अनुमति देती है जो बाइनरी में मौजूदा निर्देशों का दुरुपयोग करके मनचाहे आदेश निष्पादित करेंगी:
ROP - Return Oriented Programingहीप ओवरफ्लोज़
एक ओवरफ्लो हमेशा स्टैक में नहीं होगा, यह हीप में भी हो सकता है, उदाहरण के लिए:
Heap Overflowसुरक्षा के प्रकार
भेद्यताओं के शोषण को रोकने के लिए कई सुरक्षा उपाय हैं, उन्हें देखें:
Common Binary Exploitation Protections & BypassesLast updated