Basic Stack Binary Exploitation Methodology

हैकट्रिक्स का समर्थन करें

ELF मूल जानकारी

किसी भी चीज का उत्पीड़न शुरू करने से पहले, ELF बाइनरी के संरचना का हिस्सा समझना दिलचस्प है:

उत्पीड़न उपकरण

स्टैक ओवरफ्लो मेथडोलॉजी

इतनी सारी तकनीकों के साथ, प्रत्येक तकनीक कब उपयोगी होगी, उसका एक योजना रखना अच्छा है। ध्यान दें कि विभिन्न तकनीकों पर एक ही सुरक्षा उपाय प्रभाव डालेगा। आप प्रत्येक सुरक्षा अनुभाग में सुरक्षा उपायों को छलने के तरीके पा सकते हैं, लेकिन इस मेथडोलॉजी में नहीं।

फ्लो को नियंत्रित करना

किसी कार्यक्रम के फ्लो को नियंत्रित करने के विभिन्न तरीके हैं:

  • स्टैक ओवरफ्लो स्टैक से वापसी प्वाइंटर या EBP -> ESP -> EIP को ओवरराइट करना।

  • ओवरफ्लो को कारण बनाने के लिए एक पूर्णांक ओवरफ्लो का दुरुपयोग करना पड़ सकता है

  • या विशेषज्ञता को लिखने के लिए अनियमित लिखने के लिए अर्बिट्रे राइट्स + राइट वॉट व्हेयर टू एक्झीक्यूशन

  • फॉर्मेट स्ट्रिंग: printf का दुरुपयोग करना अनियमित सामग्री को अनियमित पतों में लिखने के लिए।

  • एरे इंडेक्सिंग: एक खराब डिज़ाइन को दुरुपयोग करना जिससे कुछ एरे को नियंत्रित करने और एक अनियमित लिखने की संभावना हो।

  • ओवरफ्लो को कारण बनाने के लिए एक पूर्णांक ओवरफ्लो का दुरुपयोग करना पड़ सकता है

  • bof से WWW के माध्यम से ROP: एक बफर ओवरफ्लो का दुरुपयोग करना और एक ROP बनाने के लिए एक बफर ओवरफ्लो का दुरुपयोग करना और एक WWW प्राप्त करने की क्षमता प्राप्त करना।

आप व्हाट व्हेर टू एक्झीक्यूशन तकनीकों को निम्नलिखित में पा सकते हैं:

अनंत लूप

ध्यान देने योग्य एक बात यह है कि आम तौर पर किसी भी वंश्यता का केवल एक उत्पीड़न काफी नहीं हो सकता है, विशेष रूप से कुछ सुरक्षा उपायों को छलना होगा। इसलिए, एक एकल वंश्यता को कई बार एक ही बाइनरी के निष्पादन में उत्पीड़नीय बनाने के कुछ विकल्पों पर चर्चा करना दिलचस्प है:

  • ROP श्रृंखला में मुख्य फ़ंक्शन का पता लिखें या उस स्थान पर पता लिखें जहां वंश्यता हो रही है।

  • एक उचित ROP श्रृंखला को नियंत्रित करने के लिए आप उस श्रृंखला में सभी क्रियाएँ कर सकते हैं

  • exit पता लिखें जीओटी में (या किसी अन्य फ़ंक्शन को उपयोग करने के लिए जो बाइनरी खत्म होने से पहले उपयोग किया जाएगा) वंश्यता पर वापस जाने के लिए पता

  • जैसा कि .fini_array** में स्पष्ट किया गया है,** यहाँ 2 फ़ंक्शन स्टोर करें, एक वन वल्न को फिर से बुलाने के लिए और एक वहाँ से**__libc_csu_fini** जो .fini_array से फ़ंक्शन को फिर से बुलाएगा।

उत्पीड़न लक्ष्य

लक्ष्य: मौजूदा फ़ंक्शन को बुलाना

  • ret2win: कोड में एक फ़ंक्शन है जिसे आपको बुलाने की आवश्यकता है (शायद कुछ विशिष्ट पैरामीटर्स के साथ) ताकि झंडा प्राप्त कर सकें।

  • एक नियमित bof बिना PIE और canary के, आपको बस स्टैक में स्टोर किए गए वापसी पते में पता लिखने की आवश्यकता है।

  • PIE के साथ एक bof में, आपको इसे छलना होगा

  • canary के साथ एक bof में, आपको इसे छलना होगा

  • यदि आपको सही से ret2win फ़ंक्शन को बुलाने के लिए कई पैरामीटर सेट करने की आवश्यकता है तो आप इस्तेमाल कर सकते हैं:

  • यदि पैरामीटर्स को तैयार करने के लिए पर्याप्त गैजेट्स हैं, तो एक ROP श्रृंखला

  • SROP (यदि आप इस सिस्टम को कॉल कर सकते हैं) एक बहुत सारे रजिस्टर्स को नियंत्रित करने के लिए

  • ret2csu और ret2vdso से गैजेट्स कई रजिस्टर्स को नियंत्रित करने के लिए

  • एक Write What Where के माध्यम से आप अन्य वल्न (bof नहीं) का दुरुपयोग करके win फ़ंक्शन को बुला सकते हैं।

  • पॉइंटर्स रीडायरेक्टिंग: यदि स्टैक में एक फ़ंक्शन के पॉइंटर हैं जो बुलाया जाएगा या एक स्ट्रिंग है जो एक दिलचस्प फ़ंक्शन (सिस्टम या printf) द्वारा उपयोग किया जाएगा, तो उस पते को ओवरराइट करना संभव है।

  • ASLR या PIE पतों पर प्रभाव डाल सकता है।

  • अअनिटाइज़्ड वेरिएबल्स: आप कभी नहीं जान सकते।

लक्ष्य: RCE

शेलकोड के माध

वाया सिसकॉल्स

  • Ret2syscall: execve को बुलाने के लिए उपयोगी। आपको पैरामीटर्स के साथ विशिष्ट सिसकॉल को बुलाने के लिए गैजेट्स खोजने की आवश्यकता है

  • यदि ASLR या PIE सक्षम हैं तो आपको उन्हें हराना होगा ROP गैजेट्स का उपयोग करने के लिए बाइनरी या लाइब्रेरी से।

  • SROP ret2execve को तैयार करने के लिए उपयोगी हो सकता है।

  • ret2csu और ret2vdso से कई रजिस्टर को नियंत्रित करने के लिए गैजेट्स।

वाया libc

  • Ret2lib: लाइब्रेरी से फ़ंक्शन को बुलाने के लिए उपयोगी (सामान्यत: libc से) जैसे system के साथ कुछ तैयार किए गए तर्क (जैसे '/bin/sh')। आपको बाइनरी को उस लाइब्रेरी को लोड करने की आवश्यकता है जिसका फ़ंक्शन आप बुलाना चाहते हैं (सामान्यत: libc)।

  • यदि स्थैतिक रूप से कंपाइल किया गया है और कोई PIE नहीं है, तो system और /bin/sh का पता नहीं बदलेगा, इसलिए इन्हें स्थैतिक रूप से उपयोग करना संभव है।

  • बिना ASLR और libc संस्करण को जानते हुए, system और /bin/sh का पता नहीं बदलेगा, इसलिए इन्हें स्थैतिक रूप से उपयोग करना संभव है।

  • ASLR के साथ लेकिन कोई PIE** नहीं, libc को जानते हुए और बाइनरी में system** फ़ंक्शन का उपयोग करते हुए system के पते पर जाने के लिए GOT में ret करना संभव है '/bin/sh' के पते में पैरामीटर (आपको इसे समझने की आवश्यकता है)।

  • ASLR के साथ लेकिन PIE के बिना, libc को जानते हुए और बाइनरी में system का उपयोग न करते हुए:

  • ret2dlresolve का उपयोग करें system का पता लगाने और इसे बुलाने के लिए

  • ASLR को बाइपास करें और system और '/bin/sh' का पता लगाएं में।

  • ASLR के साथ और PIE के साथ और libc को नहीं जानते हुए: आपको चाहिए:

  • PIE को बाइपास करें

  • उपयोग किए गए libc संस्करण को खोजें (कुछ फ़ंक्शन पतों को लीक करें)

  • आगे बढ़ने के लिए ASLR के पिछले स्थितियों की जांच करें

वाया EBP/RBP

  • Stack Pivoting / EBP2Ret / EBP Chaining: ESP को नियंत्रित करने के लिए EBP में संग्रहित EBP के माध्यम से RET को नियंत्रित करें।

  • ओफ-बाई-वन स्टैक ओवरफ्लो के लिए उपयोगी

  • EIP को नियंत्रित करने का एक वैकल्पिक तरीका जब EIP को नियंत्रित करने के बजाय मेमोरी में पेलोड निर्मित करने और फिर उस पर जाने के लिए EBP के माध्यम से उस पर जाने के लिए।

विविध

  • Pointers Redirecting: यदि स्टैक में एक फ़ंक्शन के पॉइंटर या एक स्ट्रिंग के पॉइंटर है जो बुलाया जाएगा या जो एक दिलचस्प फ़ंक्शन (सिस्टम या प्रिंटफ़) द्वारा उपयोग किया जाएगा, तो उस पते को ओवरराइट करना संभव है।

  • ASLR या PIE पतों पर प्रभाव डाल सकते हैं।

  • Uninitialized variables: आप कभी नहीं जान सकते

Last updated