Ret2ret & Reo2pop
Ret2ret
इस तकनीक का मुख्य लक्ष्य ASLR को एक मौजूदा पॉइंटर का दुरुपयोग करके छलना है।
मूल रूप से, स्टैक ओवरफ्लो आम तौर पर स्ट्रिंग्स द्वारा होते हैं, और स्ट्रिंग्स के अंत में एक नल बाइट होता है मेमोरी में। यह एक मौजूदा पॉइंटर द्वारा पॉइंट किए गए स्थान को कम करने की कोशिश करने की अनुमति देता है। इसलिए यदि स्टैक में 0xbfffffdd
था, तो यह ओवरफ्लो इसे 0xbfffff00
में बदल सकता है (अंतिम ज़ीरो बाइट का ध्यान दें)।
यदि वह पता हमारे शेलकोड को स्टैक में पॉइंट करता है, तो ret
इंस्ट्रक्शन में पते जोड़कर इसे पहुंचाना संभव है जब तक यह पहुंच जाए।
इसलिए हमला इस प्रकार होगा:
NOP स्लेड
शेलकोड
स्टैक को EIP से ओवरराइट करें
ret
के पतों के साथ (RET स्लेड)0x00 स्ट्रिंग द्वारा जोड़ा गया, स्टैक से एक पते को संशोधित करके इसे NOP स्लेड पर पॉइंट करना
इस लिंक पर एक वंलरेबल बाइनरी का उदाहरण देख सकते हैं और इसमें एक्स्प्लॉइट देख सकते हैं।
Ret2pop
यदि आप स्टैक में एक उत्कृष्ट पॉइंटर खोज सकते हैं जिसे आप संशोधित नहीं करना चाहते (ret2ret में हमने अंतिम सबसे कम बाइट को 0x00
में बदल दिया), तो आप एक समान ret2ret
हमला कर सकते हैं, लेकिन RET स्लेड की लंबाई को 1 से कम करना होगा (ताकि अंतिम 0x00
उत्कृष्ट पॉइंटर से पहले के डेटा को ओवरराइट करे), और RET स्लेड का अंतिम पता pop <reg>; ret
को पॉइंट करना चाहिए।
इस प्रकार, उत्कृष्ट पॉइंटर से पहले का डेटा स्टैक से हटा दिया जाएगा (यह डेटा 0x00
द्वारा प्रभावित होता है) और अंतिम ret
उत्कृष्ट पते को किसी भी परिवर्तन के बिना स्टैक में पॉइंट करेगा।
इस लिंक पर एक वंलरेबल बाइनरी का उदाहरण देख सकते हैं और इसमें एक्स्प्लॉइट देख सकते हैं।
संदर्भ
Last updated