मैं वास्तव में उच्च स्तरीय कोड -> निष्पादन योग्य से चरणों को समझने की कोशिश कर रहा हूं .. लेकिन कुछ कठिनाइयों का सामना कर रहा हूं।__libc_start_main में क्या चल रहा है?
मैं एक खाली int main() {}
सी फ़ाइल में लिखा है और objdump -d
के माध्यम से disassembly के समझने के लिए कोशिश कर रहा हूँ। यहाँ क्या हो रहा है है:
- , संरेखण की स्थापना की, स्टैक पर बहस धक्का,
__libc_start_main
में फोन__libc_start_main
- , अमल करने के लिए पहली पंक्ति
jmp *0x8049658
_start
में
है हालांकि, के लिए 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
इसके अलावा, क्या आप पूर्ण असेंबली कोड पोस्ट कर सकते हैं जिसका आप संदर्भ दे रहे हैं? यह हमारे जीवन को अधिक आसान बना देगा। –
यदि आप डीबगर के साथ असेंबली के माध्यम से कदम उठाते हैं तो क्या होता है? यह संभव है कि डायनामिक लिंकर मेमोरी लोकेशन 0x8049658 पर मान को ओवरराइट करता है, इसलिए जब तक प्रोग्राम 'jmp * 0x8049658' निर्देश पर जाता है, तो यह रनटाइम पर लिखे गए किसी भी मूल्य पर कूद जाता है। –
@AdamRosenfield मैं 100% नहीं कर रहा हूं कि यह कैसे करें। मुझे पता है कि मेरे सी कोड के माध्यम से चरणबद्ध करने के लिए gdb कैसे सेट करें, लेकिन यह नहीं पता कि असेंबली के लिए इसे कैसे किया जाए: S – gone