Stack Overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
एक स्टैक ओवरफ्लो एक सुरक्षा कमजोरी है जो तब होती है जब एक प्रोग्राम स्टैक पर उस डेटा से अधिक डेटा लिखता है जो इसे रखने के लिए आवंटित किया गया है। यह अतिरिक्त डेटा सन्निहित मेमोरी स्थान को ओवरराइट करेगा, जिससे वैध डेटा का भ्रष्टाचार, नियंत्रण प्रवाह में बाधा, और संभावित रूप से दुर्भावनापूर्ण कोड का निष्पादन हो सकता है। यह समस्या अक्सर असुरक्षित कार्यों के उपयोग के कारण उत्पन्न होती है जो इनपुट पर सीमा जांच नहीं करती हैं।
इस ओवरराइट की मुख्य समस्या यह है कि सहेजा गया निर्देश सूचकांक (EIP/RIP) और सहेजा गया आधार सूचकांक (EBP/RBP) पिछले कार्य में लौटने के लिए स्टैक पर संग्रहीत होते हैं। इसलिए, एक हमलावर उन्हें ओवरराइट करने में सक्षम होगा और प्रोग्राम के निष्पादन प्रवाह को नियंत्रित कर सकेगा।
यह सुरक्षा कमजोरी आमतौर पर इसलिए उत्पन्न होती है क्योंकि एक कार्य स्टैक के अंदर आवंटित मात्रा से अधिक बाइट्स की कॉपी करता है, जिससे यह स्टैक के अन्य भागों को ओवरराइट करने में सक्षम होता है।
इससे प्रभावित कुछ सामान्य कार्य हैं: strcpy
, strcat
, sprintf
, gets
... इसके अलावा, fgets
, read
& memcpy
जैसे कार्य जो लंबाई तर्क लेते हैं, यदि निर्दिष्ट लंबाई आवंटित से अधिक है तो कमजोर तरीके से उपयोग किए जा सकते हैं।
उदाहरण के लिए, निम्नलिखित कार्य कमजोर हो सकते हैं:
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 चुनौतियों में)।
इस प्रकार की CTF चुनौतियों में, बाइनरी के अंदर एक फंक्शन है जो कभी नहीं बुलाया जाता और जिसे आपको जीतने के लिए बुलाना होगा। इन चुनौतियों के लिए आपको केवल रिटर्न पते को ओवरराइट करने के लिए ऑफसेट ढूंढना है और बुलाने के लिए फंक्शन का पता लगाना है (आमतौर पर ASLR अक्षम होगा) ताकि जब कमजोर फ़ंक्शन लौटे, तो छिपा हुआ फ़ंक्शन बुलाया जाए:
इस परिदृश्य में, हमलावर स्टैक में एक शेलकोड रख सकता है और नियंत्रित EIP/RIP का दुरुपयोग करके शेलकोड पर कूद सकता है और मनचाहा कोड निष्पादित कर सकता है:
यह तकनीक पिछले तकनीक की मुख्य सुरक्षा को बायपास करने के लिए मौलिक ढांचा है: कोई निष्पादन योग्य स्टैक (NX)। और यह कई अन्य तकनीकों (ret2lib, ret2syscall...) को निष्पादित करने की अनुमति देती है जो बाइनरी में मौजूदा निर्देशों का दुरुपयोग करके मनचाहे आदेशों को निष्पादित करेंगी:
एक ओवरफ्लो हमेशा स्टैक में नहीं होगा, यह हीप में भी हो सकता है, उदाहरण के लिए:
भेद्यताओं के शोषण को रोकने के लिए कई सुरक्षा उपाय हैं, उन्हें देखें:
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)