Basic Stack Binary Exploitation Methodology
Last updated
Last updated
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
किसी भी चीज़ का शोषण करने से पहले ELF बाइनरी की संरचना का एक हिस्सा समझना दिलचस्प है:
इतनी सारी तकनीकों के साथ, यह अच्छा है कि जब प्रत्येक तकनीक उपयोगी होगी, इसका एक योजना हो। ध्यान दें कि समान सुरक्षा विभिन्न तकनीकों को प्रभावित करेगी। आप प्रत्येक सुरक्षा अनुभाग में सुरक्षा को बायपास करने के तरीके पा सकते हैं लेकिन इस पद्धति में नहीं।
एक प्रोग्राम के प्रवाह को नियंत्रित करने के लिए विभिन्न तरीके हैं:
Stack Overflows स्टैक से रिटर्न पॉइंटर या EBP -> ESP -> EIP को ओवरराइट करना।
ओवरफ्लो का कारण बनने के लिए एक Integer Overflows का दुरुपयोग करने की आवश्यकता हो सकती है।
या Arbitrary Writes + Write What Where to Execution के माध्यम से।
Format strings: printf
का दुरुपयोग करके मनमाने पते पर मनमाना सामग्री लिखना।
Array Indexing: कुछ ऐरे को नियंत्रित करने और एक मनमाना लिखने के लिए एक खराब डिज़ाइन की गई इंडेक्सिंग का दुरुपयोग करना।
ओवरफ्लो का कारण बनने के लिए एक Integer Overflows का दुरुपयोग करने की आवश्यकता हो सकती है।
bof to WWW via ROP: एक बफर ओवरफ्लो का दुरुपयोग करके एक ROP का निर्माण करना और WWW प्राप्त करना।
आप Write What Where to Execution तकनीकों को यहाँ पा सकते हैं:
ध्यान में रखने वाली एक बात यह है कि आमतौर पर एक ही भेद्यता का शोषण करना पर्याप्त नहीं हो सकता सफल शोषण को निष्पादित करने के लिए, विशेष रूप से कुछ सुरक्षा को बायपास करने की आवश्यकता होती है। इसलिए, यह दिलचस्प है कि एकल भेद्यता को एक ही बाइनरी के निष्पादन में कई बार शोषण करने के लिए कुछ विकल्पों पर चर्चा करें:
main
फ़ंक्शन का पता या उस पते को लिखें जहाँ भेद्यता हो रही है।
एक उचित ROP श्रृंखला को नियंत्रित करके, आप उस श्रृंखला में सभी क्रियाएँ करने में सक्षम हो सकते हैं।
exit
पते को GOT में (या किसी अन्य फ़ंक्शन का उपयोग बाइनरी द्वारा समाप्त होने से पहले) उस पते पर लिखें जिससे भेद्यता पर वापस जा सकें।
जैसा कि .fini_array** में समझाया गया है,** यहाँ 2 फ़ंक्शन स्टोर करें, एक फिर से vuln को कॉल करने के लिए और दूसरा __libc_csu_fini
को कॉल करने के लिए जो फिर से .fini_array
से फ़ंक्शन को कॉल करेगा।
ret2win: कोड में एक फ़ंक्शन है जिसे आपको कॉल करना है (शायद कुछ विशिष्ट पैरामीटर के साथ) ताकि फ्लैग प्राप्त किया जा सके।
PIE के साथ एक bof में, आपको इसे बायपास करने की आवश्यकता होगी।
canary के साथ एक bof में, आपको इसे बायपास करने की आवश्यकता होगी।
यदि आपको ret2win फ़ंक्शन को सही ढंग से कॉल करने के लिए कई पैरामीटर सेट करने की आवश्यकता है, तो आप उपयोग कर सकते हैं:
यदि पर्याप्त गैजेट हैं तो ROP श्रृंखला सभी पैरामीटर तैयार करने के लिए।
SROP (यदि आप इस syscall को कॉल कर सकते हैं) बहुत सारे रजिस्टर को नियंत्रित करने के लिए।
Write What Where के माध्यम से आप अन्य भेद्यताओं (bof नहीं) का दुरुपयोग करके win
फ़ंक्शन को कॉल कर सकते हैं।
Pointers Redirecting: यदि स्टैक में एक फ़ंक्शन के लिए पॉइंटर्स हैं जिसे कॉल किया जाने वाला है या एक स्ट्रिंग जो एक दिलचस्प फ़ंक्शन (system या printf) द्वारा उपयोग की जाने वाली है, तो उस पते को ओवरराइट करना संभव है।
Uninitialized variables: आप कभी नहीं जानते।
(Stack) Shellcode: यह रिटर्न पॉइंटर को ओवरराइट करने से पहले या बाद में स्टैक में एक shellcode स्टोर करने के लिए उपयोगी है और फिर इस पर कूदने के लिए:
किसी भी मामले में, यदि एक canary है, तो एक सामान्य bof में आपको इसे बायपास (leak) करने की आवश्यकता होगी।
ASLR के साथ आपको ret2esp/ret2reg जैसी तकनीकों की आवश्यकता होगी।
nx के साथ, आपको memprotect
को कॉल करने के लिए कुछ ROP का उपयोग करने की आवश्यकता होगी और कुछ पृष्ठ rwx
बनाना होगा, ताकि फिर वहाँ shellcode स्टोर किया जा सके (उदाहरण के लिए read कॉल करना) और फिर वहाँ कूदना।
यह shellcode को ROP श्रृंखला के साथ मिलाएगा।
Ret2syscall: मनमाने कमांड चलाने के लिए execve
को कॉल करने के लिए उपयोगी। आपको विशिष्ट syscall को पैरामीटर के साथ कॉल करने के लिए गैजेट्स खोजने में सक्षम होना चाहिए।
SROP ret2execve तैयार करने के लिए उपयोगी हो सकता है।
Ret2lib: एक लाइब्रेरी (आमतौर पर libc
) से एक फ़ंक्शन को कॉल करने के लिए उपयोगी जैसे system
कुछ तैयार किए गए तर्कों के साथ (जैसे '/bin/sh'
)। आपको बाइनरी को लाइब्रेरी को लोड करने की आवश्यकता है जिसमें आप कॉल करना चाहते हैं (आमतौर पर libc)।
यदि स्थैतिक रूप से संकलित और कोई PIE नहीं है, तो system
और /bin/sh
का पता नहीं बदलेगा, इसलिए आप उन्हें स्थैतिक रूप से उपयोग कर सकते हैं।
बिना ASLR और libc संस्करण को जानने के, system
और /bin/sh
का पता नहीं बदलेगा, इसलिए आप उन्हें स्थैतिक रूप से उपयोग कर सकते हैं।
ret2dlresolve
का उपयोग करें system
का पता हल करने और इसे कॉल करने के लिए।
ASLR को बायपास करें और मेमोरी में system
और '/bin/sh'
का पता निकालें।
ASLR और PIE के साथ और libc को न जानते हुए: आपको:
PIE को बायपास करना होगा।
उपयोग की गई libc
संस्करण खोजें (कुछ फ़ंक्शन पते लीक करें)।
आगे बढ़ने के लिए ASLR के साथ पिछले परिदृश्यों की जांच करें।
Stack Pivoting / EBP2Ret / EBP Chaining: स्टैक में स्टोर किए गए EBP के माध्यम से RET को नियंत्रित करने के लिए ESP को नियंत्रित करें।
off-by-one स्टैक ओवरफ्लो के लिए उपयोगी।
EIP को नियंत्रित करने के लिए एक वैकल्पिक तरीके के रूप में उपयोगी जबकि EIP का दुरुपयोग करके मेमोरी में payload का निर्माण करना और फिर EBP के माध्यम से उस पर कूदना।
Pointers Redirecting: यदि स्टैक में एक फ़ंक्शन के लिए पॉइंटर्स हैं जिसे कॉल किया जाने वाला है या एक स्ट्रिंग जो एक दिलचस्प फ़ंक्शन (system या printf) द्वारा उपयोग की जाने वाली है, तो उस पते को ओवरराइट करना संभव है।
Uninitialized variables: आप कभी नहीं जानते।
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)