<summary><strong>जानें AWS हैकिंग को शून्य से हीरो तक</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
* क्या आप **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को HackTricks में विज्ञापित देखना चाहते हैं**? या क्या आप **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करना चाहते हैं**? [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) की जाँच करें!
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह [**The PEASS Family**](https://opensea.io/collection/the-peass-family) खोजें
* [**आधिकारिक PEASS और HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या **मुझे****Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)** पर फॉलो** करें।
पिछले कार्यक्रम में **9 कार्यक्रम हेडर** हैं, फिर, **सेगमेंट मैपिंग** इसका संकेत देता है कि प्रत्येक सेक्शन किस प्रोग्राम हेडर (00 से 08 तक) में स्थित है।
ये हेडर इसका संकेत देते हैं कि **मेमोरी में बाइनरी को कैसे लोड करें**।\
प्रत्येक **LOAD** हेडर एक **मेमोरी क्षेत्र** (आकार, अनुमतियाँ और संरेखण) को दर्शाता है और ELF **बाइनरी के बाइट्स की उसमें कॉपी करने की सूचना देता है**।
उदाहरण के लिए, दूसरा हेडर 0x1190 का आकार है, 0x1fc48 पर स्थित होना चाहिए, पढ़ने और लिखने की अनुमतियों के साथ होगा और 0xfc48 से 0x528 के बाइट्स के साथ भरा जाएगा (यह सभी आरक्षित स्थान को भरता नहीं है)। यह मेमोरी सेक्शन `.init_array .fini_array .dynamic .got .data .bss` को शामिल करेगा।
बाइनरी की RELRO (स्थानांतरण केवल पढ़ने योग्य) विन्यास को दर्शाता है। यह सुरक्षा निश्चित स्थानों को केवल पढ़ने योग्य चिह्नित करेगा (जैसे `GOT` या `init` और `fini` तालिकाएँ) जब प्रोग्राम लोड हो जाता है और उसका निष्पादन शुरू होने से पहले।
पिछले उदाहरण में यह 0x3b8 बाइट्स को 0x1fc48 पर कॉपी कर रहा है जो केवल पढ़ने योग्य है और सेक्शनों `.init_array .fini_array .dynamic .got .data .bss` को प्रभावित कर रहा है।
ध्यान दें कि RELRO आंशिक या पूर्ण हो सकता है, आंशिक संस्करण **`.plt.got`** सेक्शन को संरेखित करता है नहीं, जिसे **लेजी बाइंडिंग** के लिए उपयोग किया जाता है और इस स्मृति स्थान को **लिखने की अनुमति** होनी चाहिए जिस समय उनकी स्थान खोजी जाती है।
* **स्ट्रिंग टेबल**: यह सभी स्ट्रिंग्स को समेटता है जो ELF फ़ाइल द्वारा आवश्यक हैं (लेकिन वास्तव में कार्यक्रम द्वारा उपयोग की जाने वाली नहीं।) उदाहरण के लिए, यह खंड अनुभागों के नाम जैसे `.text` या `.data` को समेटता है। और यदि `.text` स्ट्रिंग टेबल में 45 ऑफसेट पर है तो यह नाम फ़ील्ड में नंबर **45** का उपयोग करेगा।
* **`.bss`**: अपरिभाषित ग्लोबल वेरिएबल्स (या जीरो पर प्रारंभित)। यहाँ के वेरिएबल्स स्वचालित रूप से शून्य पर प्रारंभित होते हैं इसलिए बाइनरी में अनावश्यक शून्यों को जोड़ने से बचाते हैं।
* **बाइंडिंग गुण** (कमजोर, स्थानीय या ग्लोबल): स्थानीय प्रतीक केवल कार्यक्रम द्वारा ही पहुंचा जा सकता है जबकि ग्लोबल प्रतीक कार्यक्रम के बाहर साझा किए जा सकते हैं। एक कमजोर वस्तु उदाहरण के लिए एक ऐसी फ़ंक्शन है जिसे एक अलग से ओवरराइड किया जा सकता है।
* **प्रकार**: NOTYPE (कोई प्रकार निर्दिष्ट नहीं), OBJECT (ग्लोबल डेटा वेर), FUNC (फ़ंक्शन), SECTION (खंड), FILE (डीबगर के लिए स्रोत-कोड फ़ाइल), TLS (सूत्र-स्थलीय चर), GNU\_IFUNC (पुनर्स्थापन के लिए अप्रत्यक्ष फ़ंक्शन)
आवश्यक निर्देशिका इसका संकेत देती है कि कार्यक्रम **उस उल्लिखित पुस्तकालय को लोड करने की आवश्यकता** है ताकि आगे बढ़ सके। जब साझा **पुस्तकालय पूरी तरह से संचालनयोग्य और तैयार हो जाता है**, तो आवश्यक निर्देशिका पूरी हो जाती है।
लोडर को इन्हें भी पुनर्थान करना होता है जब उन्होंने उन्हें लोड कर लिया है। ये पुनर्थान पुस्तकालय में पुनर्थान सारणी में REL या RELA प्रारूप में और पुनर्थानों की संख्या डायनामिक खंडों RELSZ या RELASZ में दी गई है।
यदि **प्रोग्राम पसंदीदा पते से भिन्न स्थान पर लोड** किया गया है (सामान्यत: 0x400000) क्योंकि पता पहले से ही उपयोग में है या **ASLR** या किसी अन्य कारण से, एक स्थैतिक पुनर्स्थापना **सही करती है** जिन पॉइंटर्स की मानें बाइनरी को पसंदीदा पते पर लोड होने की उम्मीद थीं।
पुनर्स्थापना एक बाह्य प्रतीक को भी संदर्भित कर सकती है (जैसे किसी निर्भरता से फ़ंक्शन से). जैसे libC से malloc फ़ंक्शन। तब, जब लोडर libC को एक पते में लोड करता है तो देखता है कि malloc फ़ंक्शन कहाँ लोड हो रहा है, तो यह malloc का पता GOT (Global Offset Table) तालिका में लिखेगा (पुनर्स्थापना तालिका में सूचित) जहाँ malloc का पता निर्दिष्ट होना चाहिए।
तो जब एक प्रोग्राम malloc को कॉल करता है, वास्तव में यह `malloc` के संबंधित स्थान को PLT में कॉल करता है (`malloc@plt`)। जब यह पहली बार कॉल किया जाता है तो यह `malloc` का पता स्थानांतरित करता है और इसे संग्रहीत करता है ताकि अगली बार `malloc` को कॉल किया जाए, उस पते का उपयोग PLT कोड की बजाय किया जाए।
प्रोग्राम लोड होने के बाद इसे चलाने का समय है। हालांकि, पहला कोड जो चलाया जाता है **हमेशा `main` नहीं** होता है। यह इसलिए है क्योंकि उदाहरण के लिए C++ में यदि एक **ग्लोबल वेरिएबल किसी कक्षा का ऑब्जेक्ट है**, तो यह ऑब्ज
नोट करें कि ये ग्लोबल वेरिएबल्स `.data` या `.bss` में स्थित होते हैं लेकिन सूचियों `__CTOR_LIST__` और `__DTOR_LIST__` में ऑब्जेक्ट्स को इनिशियलाइज और डीस्ट्रक्ट करने के लिए स्टोर किया जाता है ताकि उनका ट्रैक रखा जा सके।
कंपाइलर की दृष्टि से, `main` फ़ंक्शन के पहले और बाद में इन क्रियाओं को निष्पादित करने के लिए, एक `init` फ़ंक्शन और एक `fini` फ़ंक्शन बनाना संभव है जिन्हें डायनामिक सेक्शन में **`INIT`** और **`FIN`** के रूप में संदर्भित किया जाएगा और ये ELF के `init` और `fini` सेक्शन में रखे जाएंगे।
दूसरा विकल्प, जैसा कि उल्लिखित है, है कि डायनामिक सेक्शन में **`INIT_ARRAY`** और **`FINI_ARRAY`** प्रविष्टियों में **`__CTOR_LIST__`** और **`__DTOR_LIST__`** की संदर्भित किया जाए और इनकी लंबाई **`INIT_ARRAYSZ`** और **`FINI_ARRAYSZ`** द्वारा दर्शाई जाती है। प्रत्येक प्रविष्टि एक फ़ंक्शन पॉइंटर है जो बिना तार्गेट के कॉल किया जाएगा।