लिनक्स ईएलएफ का परिचय: समझ और विश्लेषण

दुनिया में ऐसी चीजें हैं जो हम प्रदान करते हैं, हालांकि वे सच्ची कृति हैं। ऐसी ही एक चीज है लिनक्स यूटिलिटीज जैसे एलएस और पीएस। हालांकि वे आमतौर पर सरल के रूप में माना जाता है, अगर हम अंदर देखें तो यह मामले से बहुत दूर है। और इसलिए ELF, Executable और Linkable Format करता है। एक फ़ाइल प्रारूप जो सार्वभौमिक रूप से उपयोग किया जाता है, लेकिन कुछ इसे समझते हैं। यह त्वरित मार्गदर्शिका आपको समझने में मदद करेगी।



इस गाइड को पढ़ने के बाद, आप सीखेंगे:

  • ELF प्रारूप की आवश्यकता क्यों है और इसका उपयोग किस प्रकार की फाइलों के लिए किया जाता है
  • ELF फ़ाइल संरचना और प्रारूप विवरण
  • ELF फ़ाइल की द्विआधारी सामग्री को कैसे पढ़ें और विश्लेषण करें
  • बाइनरी फ़ाइलों का विश्लेषण करने के लिए कौन से टूल का उपयोग किया जाता है?

एक ELF फाइल क्या है?


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

विस्तार से ईएलएफ का अध्ययन क्यों करें?


तकनीकी विवरणों में गोता लगाने से पहले, यह स्पष्ट नहीं किया जाएगा कि ईएलएफ प्रारूप को समझना क्यों उपयोगी है। सबसे पहले, यह आपको ऑपरेटिंग सिस्टम के आंतरिक संचालन का अध्ययन करने की अनुमति देता है। जब कुछ गलत हुआ, तो यह ज्ञान आपको यह समझने में मदद करेगा कि वास्तव में क्या हुआ और किस कारण से हुआ। इसके अलावा, सुरक्षा छिद्रों को खोजने और संदिग्ध फाइलों का पता लगाने के लिए ईएलएफ फाइलों की जांच करने की क्षमता मूल्यवान हो सकती है। और अंत में, विकास प्रक्रिया की बेहतर समझ के लिए। यहां तक ​​कि अगर आप गो जैसी उच्च-स्तरीय भाषा में कार्यक्रम करते हैं, तो भी आप पर्दे के पीछे क्या चल रहा है, यह बेहतर जान पाएंगे।

तो ईएलएफ का अध्ययन क्यों करें?

  • ऑपरेटिंग सिस्टम की एक सामान्य समझ के लिए
  • सॉफ्टवेयर विकास के लिए
  • डिजिटल फोरेंसिक और हादसा प्रतिक्रिया (DFIR)
  • मैलवेयर अनुसंधान (बाइनरी विश्लेषण)

स्रोत से प्रक्रिया तक


जो भी ऑपरेटिंग सिस्टम हम उपयोग करते हैं, वह किसी न किसी तरह से स्रोत कोड फ़ंक्शन को सीपीयू भाषा - मशीन कोड में अनुवाद करना आवश्यक है। फ़ंक्शंस सबसे बुनियादी हो सकता है, उदाहरण के लिए, डिस्क पर फ़ाइल खोलें या स्क्रीन पर कुछ प्रदर्शित करें। सीधे सीपीयू भाषा का उपयोग करने के बजाय, हम एक प्रोग्रामिंग भाषा का उपयोग करते हैं जिसमें मानक विशेषताएं हैं। कंपाइलर तब इन कार्यों को ऑब्जेक्ट कोड में तब्दील करता है। यह ऑब्जेक्ट कोड तब लिंकर का उपयोग करके, पूरे कार्यक्रम में जुड़ा हुआ है। परिणाम एक बाइनरी फ़ाइल है जिसे एक विशिष्ट प्लेटफ़ॉर्म और विशिष्ट प्रकार के सीपीयू पर निष्पादित किया जा सकता है।

शुरू करने से पहले


इस पोस्ट में कई टीमें शामिल हैं। उन्हें टेस्ट मशीन पर चलाना बेहतर होता है। इन आदेशों को चलाने से पहले मौजूदा बायनेरिज़ की प्रतिलिपि बनाएँ। हम एक छोटा सी प्रोग्राम भी लिखेंगे जिसे आप संकलित कर सकते हैं। अंततः, कुछ सीखने के लिए अभ्यास सबसे अच्छा तरीका है।

एक ELF फ़ाइल का एनाटॉमी


एक आम गलतफहमी यह है कि ईएलएफ फाइलें केवल बाइनरी या निष्पादन योग्य फ़ाइलों के लिए हैं। हमने पहले ही कहा है कि उनका उपयोग निष्पादन योग्य फ़ाइलों (ऑब्जेक्ट कोड) के कुछ हिस्सों के लिए किया जा सकता है। एक अन्य उदाहरण पुस्तकालय फाइलें और कोर डंप (कोर फाइलें और a.out फाइलें) हैं। ELF विनिर्देशन का उपयोग लिनक्स पर कर्नेल और कर्नेल मॉड्यूल के लिए भी किया जाता है।



संरचना


ईएलएफ फ़ाइलों की व्यापकता के कारण, संरचना अलग-अलग फ़ाइलों के लिए भिन्न हो सकती है। ELF फाइल में निम्न शामिल हैं:

  1. ईएलएफ हेडर
  2. डेटा

पठनीय कमांड के साथ, हम फ़ाइल संरचना को देख सकते हैं, और यह कुछ इस तरह दिखेगा:



ईएलएफ हेडर


जैसा कि आप स्क्रीनशॉट में देख सकते हैं, ELF हेडर एक "मैजिक नंबर" से शुरू होता है। यह "मैजिक नंबर" फ़ाइल के बारे में जानकारी देता है। पहले 4 बाइट्स यह निर्धारित करते हैं कि यह एक ईएलएफ फ़ाइल है (45 = ई, 4 सी = एल, 46 = एफ, वे 7 एफ से पहले हैं)।

ELF हेडर आवश्यक है। लिंकिंग और निष्पादन के दौरान डेटा की सही ढंग से व्याख्या करने के लिए इसकी आवश्यकता होती है। एक ईएलएफ फ़ाइल के आंतरिक संचालन की बेहतर समझ के लिए, यह जानना उपयोगी है कि इस जानकारी का उपयोग किस लिए किया जाता है।

वर्ग


ईएलएफ प्रकार की घोषणा करने के बाद, एक वर्ग फ़ील्ड निम्नानुसार है। इस मान का अर्थ उस आर्किटेक्चर से है जिसके लिए फ़ाइल का इरादा है। यह 01 (32-बिट आर्किटेक्चर) या 02 (64-बिट) हो सकता है। यहाँ हम 02 देखते हैं, जिसे वाच्य कमांड द्वारा ELF64 फाइल के रूप में अनुवादित किया जाता है, अर्थात दूसरे शब्दों में, यह फाइल 64-बिट आर्किटेक्चर का उपयोग करती है। यह आश्चर्य की बात नहीं है, मेरी कार में एक आधुनिक प्रोसेसर स्थापित है।

डेटा


इसके बाद "डेटा" फ़ील्ड आता है, जिसमें दो विकल्प होते हैं: 01 - LSB (कम से कम महत्वपूर्ण बिट), जिसे लिटिल-एंडियन भी कहा जाता है, या 02 - MSB (सबसे महत्वपूर्ण बिट, बिग-एंडियन)। ये मान फ़ाइल की बाकी वस्तुओं की व्याख्या करने में मदद करते हैं। यह महत्वपूर्ण है क्योंकि विभिन्न प्रकार के प्रोसेसर डेटा संरचनाओं को अलग तरीके से संभालते हैं। हमारे मामले में, एलएसबी का उपयोग किया जाता है, क्योंकि प्रोसेसर में एक AMD64 वास्तुकला है।

बाइनरी फ़ाइल पर हेक्सडंप उपयोगिता का उपयोग करते समय एलएसबी प्रभाव दिखाई देता है। आइए देखें कि एलईएफ हेडर / बिन / पीएस के लिए।

$ hexdump -n 16 /bin/ps 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 

हम देखते हैं कि डेटा ऑर्डर की व्याख्या के कारण मूल्यों के जोड़े अलग-अलग हैं।

संस्करण


फिर एक और जादुई मूल्य "01" का अनुसरण करता है, जो कि संस्करण संख्या है। केवल संस्करण 01 वर्तमान में उपलब्ध है, इसलिए इस संख्या का मतलब कुछ भी दिलचस्प नहीं है।

ओएस / एबीआई


प्रत्येक ऑपरेटिंग सिस्टम के पास कॉलिंग फ़ंक्शंस का अपना तरीका है, उनके पास बहुत कुछ सामान्य है, लेकिन, इसके अलावा, प्रत्येक सिस्टम में छोटे अंतर हैं। फ़ंक्शन कॉल का क्रम एप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) द्वारा निर्धारित किया जाता है। OS / ABI फ़ील्ड वर्णन करती है कि कौन सा ABI उपयोग किया गया है और इसका संस्करण। हमारे मामले में, मान 00 है, जिसका अर्थ है कि विशिष्ट एक्सटेंशन का उपयोग नहीं किया जाता है। आउटपुट में, इसे सिस्टम V के रूप में दिखाया गया है।

ABI संस्करण


यदि आवश्यक हो, तो एक ABI संस्करण इंगित किया जा सकता है।

मशीन


शीर्षक भी अपेक्षित प्रकार की मशीन (AMD64) को इंगित करता है।

टाइप


प्रकार फ़ील्ड इंगित करता है कि फ़ाइल किस लिए है। यहाँ कुछ सामान्य फ़ाइल प्रकार हैं।

कोर (मूल्य 4)
DYN (साझा ऑब्जेक्ट फ़ाइल), लाइब्रेरी (मान 3)
EXEC (निष्पादन योग्य फ़ाइल), निष्पादन योग्य फ़ाइल (मान 2)
REL (स्थानांतरित करने योग्य फ़ाइल), लिंक करने से पहले फ़ाइल (मान 1)

पूरा शीर्षक देखें


हालाँकि कुछ क्षेत्रों को आसानी से पढ़ा जा सकता है, वास्तव में और भी हैं। उदाहरण के लिए, आप पता लगा सकते हैं कि फ़ाइल किस प्रोसेसर के लिए है। पूर्ण ईएलएफ हेडर और सभी मूल्यों को देखने के लिए हेक्सडंप का उपयोग करें।

 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 02 00 3e 00 01 00 00 00 a8 2b 40 00 00 00 00 00 |..>......+@.....| 40 00 00 00 00 00 00 00 30 65 01 00 00 00 00 00 |@.......0e......| 00 00 00 00 40 00 38 00 09 00 40 00 1c 00 1b 00 |....@.8...@.....| 

(आउटपुट हेक्सडंप -C 64 एन / बिन / पीएस)

हाइलाइट किया गया फ़ील्ड मशीन के प्रकार को निर्धारित करता है। मान 3e दशमलव 62 है, जो AMD64 से मेल खाता है। सभी फ़ाइल प्रकारों का विचार प्राप्त करने के लिए, यह हेडर फ़ाइल देखें।

यद्यपि आप एक हेक्साडेसिमल डंप में यह सब कर सकते हैं, यह एक उपकरण का उपयोग करने के लिए समझ में आता है जो आपके लिए काम करता है। डंप की उपयोगिता उपयोगी हो सकती है। यह ईएलएफ हेडर से मेल खाते हुए फॉर्मैटेड आउटपुट दिखाता है। यह अध्ययन करना अच्छा होगा कि किन क्षेत्रों का उपयोग किया जाता है, और उनके विशिष्ट मूल्य क्या हैं।

अब, जहां हमने इन क्षेत्रों का अर्थ समझाया है, यह देखने का समय है कि असली जादू उनके पीछे क्या है और अगले शीर्षकों पर आगे बढ़ें!

फ़ाइल डेटा


हेडर के अलावा, ELF फ़ाइलों में तीन भाग होते हैं।

  • प्रोग्राम हेडर या सेगमेंट
  • अनुभाग या अनुभाग शीर्षक
  • डेटा

इससे पहले कि हम इन शीर्ष लेखों में गोता लगाएँ, यह जानना उपयोगी होगा कि ELF फ़ाइल में दो अलग-अलग "प्रकार" हैं। उनमें से एक लिंकर के लिए डिज़ाइन किया गया है और कोड निष्पादन (सेगमेंट) की अनुमति देता है। अन्य कमांड और डेटा (सेक्शन) के लिए है। उद्देश्य के आधार पर, उपयुक्त हेडर प्रकार का उपयोग किया जाता है। आइए प्रोग्राम हेडर से शुरू करें, जो ईएलएफ निष्पादन योग्य फाइलों में स्थित है।

कार्यक्रम के शीर्षक


एक ELF फ़ाइल में शून्य या अधिक सेगमेंट होते हैं, और यह बताता है कि कैसे एक प्रक्रिया बनाई जाए, रनटाइम निष्पादन के लिए एक मेमोरी इमेज। जब कर्नेल इन खंडों को देखता है, तो यह उन्हें mmap (2) सिस्टम कॉल का उपयोग करके वर्चुअल एड्रेस स्पेस में रखता है। दूसरे शब्दों में, यह पूर्व-तैयार निर्देशों को स्मृति में एक छवि में परिवर्तित करता है। यदि ELF फ़ाइल एक नियमित बाइनरी है, तो इसके लिए इन प्रोग्राम हेडर की आवश्यकता होती है, अन्यथा यह सिर्फ काम नहीं करेगा। इन हेडर का उपयोग प्रक्रिया को बनाने के लिए संबंधित डेटा संरचनाओं के साथ किया जाता है। साझा पुस्तकालयों के लिए, प्रक्रिया समान है।


बाइनरी ईएलएफ फ़ाइल में प्रोग्राम हेडर

हम इस उदाहरण में 9 कार्यक्रम के शीर्षक देखते हैं। पहले तो यह समझना मुश्किल है कि उनका क्या मतलब है। आइए विवरणों में डुबकी लगाएं।

GNU_EH_FRAME


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

GNU_STACK


इस हेडर का उपयोग स्टैक जानकारी को बचाने के लिए किया जाता है। एक दिलचस्प विशेषता यह है कि स्टैक को निष्पादन योग्य नहीं होना चाहिए, क्योंकि इससे सुरक्षा कमजोरियां हो सकती हैं।

यदि GNU_STACK खंड गायब है, तो निष्पादन योग्य स्टैक का उपयोग किया जाता है। स्कैनफ़्ल और एक्स्टस्टैक यूटिलिटीज़ स्टैक डिवाइस का विवरण दिखाती हैं।

 # scanelf -e /bin/ps TYPE STK/REL/PTL FILE ET_EXEC RW- R-- RW- /bin/ps # execstack -q /bin/ps - /bin/ps 

प्रोग्राम हेडर देखने के लिए कमांड करता है:

  • दुपट्टा (पैक्स-बर्तन)
  • elfls -S / bin / ps
  • यूरोप-रीड -प्रोग्राम-हेडर / बिन / पीएस

ईएलएफ अनुभाग


अनुभाग प्रमुख


सेक्शन हेडर एक फाइल के सभी सेक्शन को परिभाषित करते हैं। जैसा कि पहले ही उल्लेख किया गया है, इस जानकारी का उपयोग लिंकिंग और स्थानांतरण के लिए किया जाता है।

GNU C कंपाइलर कोड को कोड कोड को असेम्बलर में बदल देता है, और GNU एसेंबलर ऑब्जेक्ट बनाता है, तब एक ELF फाइल में सेक्शन दिखाई देते हैं।

जैसा कि ऊपर चित्र में दिखाया गया है, एक खंड में 0 या अधिक अनुभाग हो सकते हैं। निष्पादन योग्य फ़ाइलों के लिए चार मुख्य खंड हैं: .text, .data, .rodata और .bss। इनमें से प्रत्येक अनुभाग विभिन्न अनुमतियों के साथ बूट होता है, जिसे रीड-एस के साथ देखा जा सकता है।

.text


निष्पादन योग्य कोड शामिल हैं। इसे एक सेगमेंट में पढ़ा और निष्पादित अधिकारों के साथ पैक किया जाएगा। इसे एक बार डाउनलोड किया जाता है, और इसकी सामग्री नहीं बदलती है। इसे objdump उपयोगिता के साथ देखा जा सकता है।

 12 .text 0000a3e9 0000000000402120 0000000000402120 00002120 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 

.data


प्रारंभिक डेटा पढ़ने और लिखने की अनुमति के साथ।

.rodata


आरंभिक डेटा केवल-पढ़ने की अनुमति के साथ। (= ए)।

.bss


पढ़ने / लिखने की अनुमति के साथ अनधिकृत डेटा। (= WA)

 [24] .data PROGBITS 00000000006172e0 000172e0 0000000000000100 0000000000000000 WA 0 0 8 [25] .bss NOBITS 00000000006173e0 000173e0 0000000000021110 0000000000000000 WA 0 0 32 


अनुभागों और शीर्षकों को देखने की आज्ञा देता है।

  • dumpelf
  • elfls -p / bin / ps
  • यूरोप-पठनीय-हेडर / बिन / पीएस
  • readelf -S / bin / ps
  • objdump -h / bin / ps

अनुभाग समूह


कुछ वर्गों को समूहीकृत किया जा सकता है जैसे कि उन्होंने एक पूरे का गठन किया हो। नए लिंकर्स इस कार्यक्षमता का समर्थन करते हैं। लेकिन जबकि यह आम नहीं है।

 # readelf -g /bin/ps There are no section groups in this file. 

हालांकि यह बहुत दिलचस्प नहीं लग सकता है, ELF फाइल विश्लेषण उपकरण के ज्ञान से बहुत लाभ मिलता है। इस कारण से, इन उपकरणों और उनके उद्देश्य का अवलोकन लेख के अंत में दिया गया है।

स्थिर और गतिशील बायनेरिज़


ईएलएफ बायनेरिज़ के साथ काम करते समय, यह जानना उपयोगी होगा कि ये दो प्रकार की फाइलें कैसे जुड़ी हुई हैं। वे स्थिर और गतिशील हो सकते हैं, और यह उन पुस्तकालयों पर लागू होता है जो वे उपयोग करते हैं। यदि बाइनरी "गतिशील" है, तो इसका मतलब है कि यह बाहरी पुस्तकालयों का उपयोग करता है जिसमें कुछ सामान्य कार्य होते हैं, जैसे फ़ाइल खोलना या नेटवर्क सॉकेट बनाना। स्टेटिक बायनेरिज़, इसके विपरीत, सभी आवश्यक पुस्तकालयों को शामिल करते हैं।

यदि आप जाँचना चाहते हैं कि फ़ाइल स्थिर या गतिशील है, तो फ़ाइल कमांड का उपयोग करें। वह कुछ इस तरह दिखाएगी:

 $ file /bin/ps /bin/ps: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), <b>dynamically linked (uses shared libs)</b>, for GNU/Linux 2.6.24, BuildID[sha1]=2053194ca4ee8754c695f5a7a7cff2fb8fdd297e, stripped 

यह निर्धारित करने के लिए कि किस बाहरी लाइब्रेरी का उपयोग किया जाता है, बस उसी बाइनरी पर ldd का उपयोग करें:

 $ ldd /bin/ps linux-vdso.so.1 => (0x00007ffe5ef0d000) libprocps.so.3 => /lib/x86_64-linux-gnu/libprocps.so.3 (0x00007f8959711000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f895934c000) /lib64/ld-linux-x86-64.so.2 (0x00007f8959935000) 

टिप: आगे की निर्भरता को देखने के लिए, यह लैडट्री उपयोगिता का उपयोग करना बेहतर है।

बाइनरी विश्लेषण उपकरण


यदि आप ईएलएफ फाइलों का विश्लेषण करना चाहते हैं, तो यह निश्चित रूप से पहले मौजूदा उपकरणों को देखने के लिए उपयोगी होगा। बायनेरिज़ और निष्पादन योग्य कोड के रिवर्स विकास के लिए टूलकिट हैं। यदि आप ELF फ़ाइलों का विश्लेषण करने के लिए नए हैं, तो स्थैतिक विश्लेषण से शुरू करें। स्थैतिक विश्लेषण का अर्थ है कि हम उन्हें शुरू किए बिना फ़ाइलों की जांच करते हैं। जब आप उनके काम को बेहतर ढंग से समझने लगते हैं, तो गतिशील विश्लेषण पर आगे बढ़ें। उदाहरणों को चलाएं और उनके वास्तविक व्यवहार को देखें।

लोकप्रिय उपकरण


Radare2


Radare2 टूलकिट Sergi Alvarez द्वारा बनाई गई थी। संख्या 2 का अर्थ है कि पहले संस्करण की तुलना में कोड पूरी तरह से फिर से लिखा गया है। अब यह कई शोधकर्ताओं द्वारा कोड के संचालन का अध्ययन करने के लिए उपयोग किया जाता है।

सॉफ्टवेयर पैकेज


अधिकांश लिनक्स सिस्टम में बिन्यूटिल स्थापित हैं। अन्य पैकेज आपको अधिक जानकारी देखने में मदद कर सकते हैं। सही टूलकिट आपके काम को सरल करेगा, खासकर यदि आप ईएलएफ फ़ाइलों का विश्लेषण कर रहे हैं। मैंने यहाँ ELF फ़ाइलों के विश्लेषण के लिए संकुल और उपयोगिताओं की एक सूची तैयार की है।

elfutils
/ usr / bin / eu-addr2line
/ usr / bin / eu-ar - आर्क फ़ाइलों को बनाने और संसाधित करने के लिए एक विकल्प
/ usr / bin / eu-elfcmp
/ usr / bin / eu-elflint - gABI और psABI विनिर्देशों के अनुपालन के लिए जाँच करें
/ usr / bin / eu-findtextrel - पाठ रिलोकेशन की खोज करें
/ usr / bin / eu-ld - ऑब्जेक्ट और आर्काइव फ़ाइलों को जोड़ती है
/ usr / bin / eu-make-debug- आर्काइव
/ usr / bin / eu-nm - वस्तु और निष्पादन योग्य फ़ाइलों के प्रतीकों को दर्शाता है
/ usr / bin / eu-objdump - ऑब्जेक्ट फ़ाइल से जानकारी दिखाता है
/ usr / bin / eu-ranlib - संग्रह फ़ाइलों की एक सूची बनाता है
/ usr / bin / eu-readelf - पढ़ने योग्य रूप में ELF फ़ाइल दिखाता है
/ usr / bin / eu-size - प्रत्येक अनुभाग का आकार दिखाता है (पाठ, डेटा, bss, आदि)
/ usr / bin / eu-stack - वर्तमान प्रक्रिया या कर्नेल डंप का ढेर दिखाता है
/ usr / bin / eu-strings - टेक्स्ट स्ट्रिंग्स दिखाता है (जैसे स्ट्रिंग्स यूटिलिटी)
/ usr / bin / eu-strip - ELF फ़ाइल से वर्ण तालिका हटाता है
/ usr / bin / eu-unstrip - बाइनरी में प्रतीकों और डीबगिंग जानकारी जोड़ता है
नोट: एल्फुटिल्स पैकेज एक अच्छी शुरुआत होगी, इसमें अधिकांश विश्लेषण उपकरण शामिल हैं

elfkickers
/ usr / bin / ebfc - ब्रेनफैक भाषा संकलक
/ usr / bin / elfls - झंडे के साथ कार्यक्रम हेडर और अनुभाग हेडर दिखाता है
/ usr / bin / elftoc - एक बाइनरी को C प्रोग्राम में कनवर्ट करता है
/ usr / bin / infect - एक ड्रॉपर को इंजेक्ट करने वाली एक उपयोगिता / tmp में एक setuid फ़ाइल बनाता है
/ usr / bin / objres - नियमित या बाइनरी डेटा से एक ऑब्जेक्ट बनाता है
/ usr / bin / rebind - ELF फ़ाइलों में वर्णों की बाइंडिंग और दृश्यता में परिवर्तन करता है
/ usr / bin / sstrip - एक ईएलएफ फ़ाइल से अनावश्यक घटकों को निकालता है
नोट: ELFKickers पैकेज के लेखक ELF फ़ाइलों में हेरफेर करने पर ध्यान केंद्रित करते हैं, जो आपको "गलत" ELF बायनेरिज़ के साथ काम करते समय अधिक जानकारी प्राप्त करने की अनुमति देता है

पैक्स-utils
/ यूएसआर / बिन / डंपफेल - आंतरिक ईएलएफ संरचना का डंप
/ usr / bin / lddtree - ldd की तरह, निर्भरता के स्तर को प्रदर्शित करने के साथ
/ usr / bin / pspax - चल रही प्रक्रियाओं के बारे में ELF / PaX जानकारी प्रदर्शित करता है
/ usr / bin / scanelf - जानकारी की एक विस्तृत श्रृंखला, जिसमें पाक्स विवरण शामिल है
/ usr / bin / scanmacho - मच-ओ बायनेरिज़ (मैक ओएस एक्स) का विवरण दिखाता है
/ usr / bin / symtree - ट्री अक्षर दिखाता है
नोट: इस पैकेज की कुछ उपयोगिताएं निर्देशिकाओं को स्कैन कर सकती हैं, और किसी निर्देशिका की संपूर्ण सामग्री का विश्लेषण करने के लिए आदर्श हैं। ध्यान PaX अनुसंधान उपकरणों पर है। ईएलएफ का समर्थन करने के अलावा, आप माच-ओ बायनेरिज़ से जानकारी निकाल सकते हैं।

आउटपुट उदाहरण
 scanelf -a /bin/ps TYPE PAX PERM ENDIAN STK/REL/PTL TEXTREL RPATH BIND FILE ET_EXEC PeMRxS 0755 LE RW- R-- RW- - - LAZY /bin/ps 


prelink
/ usr / bin / execstack - आप स्टैक निष्पादन योग्य है या नहीं, इसके बारे में जानकारी देख या बदल सकते हैं
/ usr / bin / prelink - प्रक्रिया को गति देने के लिए ELF फ़ाइलों में कॉल स्थानांतरित करता है

अक्सर पूछे जाने वाले प्रश्न


एक ABI क्या है?


ABI अनुप्रयोग बाइनरी इंटरफ़ेस है और ऑपरेटिंग सिस्टम और निष्पादन योग्य कोड के बीच एक निम्न-स्तरीय इंटरफ़ेस को परिभाषित करता है।

ईएलएफ क्या है?


ईएलएफ एक निष्पादन योग्य और लिंक करने योग्य प्रारूप है। यह एक प्रारूप विनिर्देश है जो परिभाषित करता है कि निष्पादन योग्य कोड में निर्देश कैसे लिखे गए हैं।

मैं फ़ाइल प्रकार कैसे देख सकता हूँ?


विश्लेषण के पहले चरण के लिए फ़ाइल कमांड का उपयोग करें। यह कमांड "मैजिक" नंबर और हेडिंग से निकाले गए विवरण को दिखाने में सक्षम है।

निष्कर्ष


ELF फाइलें निष्पादन और लिंकिंग के लिए हैं। उद्देश्य के आधार पर, उनमें आवश्यक सेगमेंट और अनुभाग शामिल हैं। OS का कर्नेल खंडों को स्कैन करता है और उन्हें मेमोरी में (mmap का उपयोग करके) मैप करता है। अनुभाग एक लिंकर द्वारा देखे जाते हैं जो एक निष्पादन योग्य फ़ाइल या साझा ऑब्जेक्ट बनाता है।

ELF फाइलें बहुत लचीली होती हैं और विभिन्न प्रकार के CPU, मशीन आर्किटेक्चर और ऑपरेटिंग सिस्टम का समर्थन करती हैं। यह एक्स्टेंसिबल भी है, प्रत्येक फ़ाइल को अलग-अलग डिज़ाइन किया गया है, जो आवश्यक भागों पर निर्भर करता है। सही उपकरण का उपयोग करके, आप फ़ाइल के उद्देश्य का पता लगा सकते हैं और बाइनरी फ़ाइलों की सामग्री की जांच कर सकते हैं। आप फ़ाइल में निहित कार्यों और लाइनों को देख सकते हैं। मैलवेयर का अनुसंधान करने वालों के लिए एक अच्छी शुरुआत, या यह समझने के लिए कि प्रक्रिया एक निश्चित तरीके से व्यवहार (या नहीं) क्यों करती है।

आगे के अध्ययन के लिए संसाधन


यदि आप ईएलएफ और रिवर्स इंजीनियरिंग के बारे में अधिक जानना चाहते हैं, तो आप लिनक्स सिक्योरिटी एक्सपर्ट में जो काम करते हैं, उसे देख सकते हैं। पाठ्यक्रम के हिस्से के रूप में, हमारे पास हाथों से काम करने वाले प्रयोगशाला काम के साथ एक रिवर्स इंजीनियरिंग मॉड्यूल है

आप में से जो लोग पढ़ना पसंद करते हैं, उनके लिए एक अच्छा और गहरा दस्तावेज़: ईएलएफ फॉर्मेट और ब्रायन राइटर द्वारा लिखित एक पेपर , जिसे एल्फिकर्स भी कहा जाता है। जो लोग स्रोत को समझना पसंद करते हैं, वे Apple के प्रलेखित ELF हेडर को देखें

परिषद:
यदि आप फ़ाइलों के विश्लेषण में बेहतर होना चाहते हैं, तो उस लोकप्रिय विश्लेषण उपकरण का उपयोग करना शुरू करें जो वर्तमान में उपलब्ध है।

Source: https://habr.com/ru/post/hi480642/


All Articles