4.2 KiB

Relro

{{#include ../../../banners/hacktricks-training.md}}

Relro

RELRO का मतलब है Relocation Read-Only, और यह बाइनरी में एक सुरक्षा विशेषता है जो GOT (Global Offset Table) ओवरराइट्स से संबंधित जोखिमों को कम करने के लिए उपयोग की जाती है। आइए इस अवधारणा को स्पष्टता के लिए इसके दो अलग-अलग प्रकारों में विभाजित करें: Partial RELRO और Full RELRO

Partial RELRO

Partial RELRO सुरक्षा बढ़ाने के लिए एक सरल दृष्टिकोण अपनाता है बिना बाइनरी के प्रदर्शन पर महत्वपूर्ण प्रभाव डाले। GOT को प्रोग्राम के वेरिएबल्स के ऊपर मेमोरी में रखने के द्वारा, Partial RELRO का उद्देश्य बफर ओवरफ्लो को GOT तक पहुँचने और उसे भ्रष्ट करने से रोकना है

यह GOT को मनमाने लिखने की कमजोरियों से दुरुपयोग से नहीं रोकता है।

Full RELRO

Full RELRO सुरक्षा को बढ़ाता है GOT को पूरी तरह से पढ़ने-के-लिए-ही-योग्य बनाकर। एक बार जब बाइनरी शुरू होती है, तो सभी फ़ंक्शन पते GOT में हल और लोड किए जाते हैं, फिर GOT को पढ़ने-के-लिए-ही-योग्य के रूप में चिह्नित किया जाता है, जो रनटाइम के दौरान इसमें किसी भी संशोधन को प्रभावी रूप से रोकता है।

हालांकि, Full RELRO के साथ व्यापार-समझौता प्रदर्शन और स्टार्टअप समय के संदर्भ में है। क्योंकि इसे GOT को पढ़ने-के-लिए-ही-योग्य के रूप में चिह्नित करने से पहले सभी गतिशील प्रतीकों को स्टार्टअप पर हल करना आवश्यक है, Full RELRO सक्षम बाइनरी में लंबे लोड समय का अनुभव हो सकता है। यह अतिरिक्त स्टार्टअप ओवरहेड ही कारण है कि Full RELRO सभी बाइनरी में डिफ़ॉल्ट रूप से सक्षम नहीं है।

यह देखना संभव है कि क्या किसी बाइनरी में Full RELRO सक्षम है:

readelf -l /proc/ID_PROC/exe | grep BIND_NOW

Bypass

यदि Full RELRO सक्षम है, तो इसे बायपास करने का एकमात्र तरीका यह है कि कोई और तरीका खोजा जाए जिसे मनमाने निष्पादन के लिए GOT तालिका में लिखने की आवश्यकता न हो।

ध्यान दें कि LIBC का GOT आमतौर पर Partial RELRO होता है, इसलिए इसे मनमाने लिखने के साथ संशोधित किया जा सकता है। अधिक जानकारी के लिए Targetting libc GOT entries पर जाएं।

{{#include ../../../banners/hacktricks-training.md}}