2013-06-06 13 views
14

मैं वास्तव में उच्च स्तरीय कोड -> निष्पादन योग्य से चरणों को समझने की कोशिश कर रहा हूं .. लेकिन कुछ कठिनाइयों का सामना कर रहा हूं।__libc_start_main में क्या चल रहा है?

मैं एक खाली int main() {} सी फ़ाइल में लिखा है और objdump -d के माध्यम से disassembly के समझने के लिए कोशिश कर रहा हूँ। यहाँ क्या हो रहा है है:

    _start में
  • , संरेखण की स्थापना की, स्टैक पर बहस धक्का, __libc_start_main में फोन __libc_start_main
  • , अमल करने के लिए पहली पंक्ति jmp *0x8049658

है हालांकि, के लिए objdump -R का उपयोग कर पर स्थानांतरण स्थान देखें, 0x8049658 में मान __libc_start_main है!

.. मैं यहाँ कुछ याद कर रहा हूँ

संपादित करें: यहाँ स्रोत के कुछ है,

080482c0 <[email protected]>: 
80482c0:  ff 25 58 96 04 08  jmp *0x8049658 
80482c6:  68 08 00 00 00   push $0x8 
80482cb:  e9 d0 ff ff ff   jmp 80482a0 <_init+0x2c> 

Disassembly of section .text: 

080482d0 <_start>: 
80482d0:  31 ed     xor %ebp,%ebp 
80482d2:  5e      pop %esi 
80482d3:  89 e1     mov %esp,%ecx 
80482d5:  83 e4 f0    and $0xfffffff0,%esp 
80482d8:  50      push %eax 
80482d9:  54      push %esp 
80482da:  52      push %edx 
80482db:  68 50 84 04 08   push $0x8048450 
80482e0:  68 e0 83 04 08   push $0x80483e0 
80482e5:  51      push %ecx 
80482e6:  56      push %esi 
80482e7:  68 d0 83 04 08   push $0x80483d0 
80482ec:  e8 cf ff ff ff   call 80482c0 <[email protected]> 
80482f1:  f4      hlt 
80482f2:  66 90     xchg %ax,%ax 



DYNAMIC RELOCATION RECORDS 
OFFSET TYPE    VALUE 
08049644 R_386_GLOB_DAT __gmon_start__ 
08049654 R_386_JUMP_SLOT __gmon_start__ 
08049658 R_386_JUMP_SLOT __libc_start_main 
+0

इसके अलावा, क्या आप पूर्ण असेंबली कोड पोस्ट कर सकते हैं जिसका आप संदर्भ दे रहे हैं? यह हमारे जीवन को अधिक आसान बना देगा। –

+1

यदि आप डीबगर के साथ असेंबली के माध्यम से कदम उठाते हैं तो क्या होता है? यह संभव है कि डायनामिक लिंकर मेमोरी लोकेशन 0x8049658 पर मान को ओवरराइट करता है, इसलिए जब तक प्रोग्राम 'jmp * 0x8049658' निर्देश पर जाता है, तो यह रनटाइम पर लिखे गए किसी भी मूल्य पर कूद जाता है। –

+0

@AdamRosenfield मैं 100% नहीं कर रहा हूं कि यह कैसे करें। मुझे पता है कि मेरे सी कोड के माध्यम से चरणबद्ध करने के लिए gdb कैसे सेट करें, लेकिन यह नहीं पता कि असेंबली के लिए इसे कैसे किया जाए: S – gone

उत्तर

8

पहले खंड, "@plt" से समाप्त होने वाले प्रक्रिया लिंकेज तालिका (https://stackoverflow.com/a/5469334/994153) है। jmp *0x8049658 एक अप्रत्यक्ष शाखा निर्देश है, इसलिए यह वास्तव में __libc_start_main पर जा रहा है जहां भी वास्तव में रनटाइम पर रैम में लोड हो जाता है।

__libc_start_main का असली रैम पता डायनामिक रिलायंस रिकॉर्ड्स टेबल में पाया गया है, जो प्रोग्राम लोड होने पर गतिशील लोडर द्वारा रैम में बनाया गया है।

+0

में प्रकट होता है यह वास्तव में इन दिनों पहली बार कॉल पर हल हो जाता है, यह ब्लॉग पोस्ट दिखाता है कि कैसे रन-टाइम http: //dustin.schultz पर काम कर रहे गतिशील लिंकर को देख सकते हैं। io/how-is-glibc-loaded-at-runtime.html – falstaff

+0

^कीवर्ड द्वारा खोजे जाने वालों के लिए इसे 'आलसी लोडिंग' कहा जाता है। – sherrellbc

संबंधित मुद्दे