मैं बफर अतिप्रवाह के साथ प्रयोग कर रहा हूँ और fgetsfgets
की एक निश्चित इनपुट के साथ ढेर के वापसी पता ओवरराइट करने का प्रयास के साथ एक बफर अतिप्रवाह के कारण इस कोड है सामान्य निष्पादन कार्यक्रम सिर्फ आपके इनपुट देता है। मैं कोड को संशोधित किए बिना foo() आउटपुट करना चाहता हूं।
मेरा विचार buf
के बफर को 20 'A'
एस दर्ज करके ओवरफ़्लो करना था। यह एक सेगमेंटेशन गलती का काम करता है और कारण बनता है। मेरा अगला विचार foo()
का पता लगाना था जो \x4006cd
है और इसे 20 'A'
एस में संलग्न करें।
मेरी समझ से यह ढेर के वापसी पते को ओवरराइट करना चाहिए और इसे foo
पर कूदना चाहिए। लेकिन यह केवल एक segfault का कारण बनता है।
मैं क्या गलत कर रहा हूं?
अद्यतन: असेंबलर उदासीनता मुख्य
Dump of assembler code for function main:
0x000000000040073b <+0>: push %rbp
0x000000000040073c <+1>: mov %rsp,%rbp
0x000000000040073f <+4>: sub $0x10,%rsp
0x0000000000400743 <+8>: mov %edi,-0x4(%rbp)
0x0000000000400746 <+11>: mov %rsi,-0x10(%rbp)
0x000000000040074a <+15>: mov $0x0,%eax
0x000000000040074f <+20>: callq 0x4006f1 <bar>
0x0000000000400754 <+25>: mov $0x0,%eax
0x0000000000400759 <+30>: leaveq
0x000000000040075a <+31>: retq
End of assembler dump.
foo
Dump of assembler code for function foo:
0x00000000004006cd <+0>: push %rbp
0x00000000004006ce <+1>: mov %rsp,%rbp
0x00000000004006d1 <+4>: mov 0x200990(%rip),%rax # 0x601068 <[email protected]@GLIBC_2.2.5>
0x00000000004006d8 <+11>: mov %rax,%rcx
0x00000000004006db <+14>: mov $0x15,%edx
0x00000000004006e0 <+19>: mov $0x1,%esi
0x00000000004006e5 <+24>: mov $0x400804,%edi
0x00000000004006ea <+29>: callq 0x4005d0 <[email protected]>
0x00000000004006ef <+34>: pop %rbp
0x00000000004006f0 <+35>: retq
End of assembler dump.
बार:
Dump of assembler code for function bar:
0x00000000004006f1 <+0>: push %rbp
0x00000000004006f2 <+1>: mov %rsp,%rbp
0x00000000004006f5 <+4>: sub $0x20,%rsp
0x00000000004006f9 <+8>: mov $0x40081a,%edi
0x00000000004006fe <+13>: callq 0x400570 <[email protected]>
0x0000000000400703 <+18>: mov 0x200956(%rip),%rdx # 0x601060 <[email protected]@GLIBC_2.2.5>
0x000000000040070a <+25>: lea -0x20(%rbp),%rax
0x000000000040070e <+29>: mov $0x18,%esi
0x0000000000400713 <+34>: mov %rax,%rdi
0x0000000000400716 <+37>: callq 0x4005b0 <[email protected]>
0x000000000040071b <+42>: lea -0x20(%rbp),%rax
0x000000000040071f <+46>: mov %rax,%rdi
0x0000000000400722 <+49>: callq 0x400580 <[email protected]>
0x0000000000400727 <+54>: mov %rax,%rsi
0x000000000040072a <+57>: mov $0x400821,%edi
0x000000000040072f <+62>: mov $0x0,%eax
0x0000000000400734 <+67>: callq 0x400590 <[email protected]>
0x0000000000400739 <+72>: leaveq
0x000000000040073a <+73>: retq
End of assembler dump.
क्या आपने इस कोड के लिए संबंधित असेंबलर (और इस प्रकार स्टैक लेआउट) देखा है? –
अगर यह केवल इतना आसान था ... –
आपको संबंधित असेंबली को देखना चाहिए। कभी-कभी संकलक 20 से अधिक बाइट करता है जिसे आपने संरेखण के लिए बनाया है। आपको स्टैक के लेआउट को भी देखना चाहिए और रजिस्टरों/सहेजे गए रीट एडर्स कैसे सहेजे जाते हैं और किस क्रम में। आगे बढ़ें और फ़ंक्शन की असीम पोस्ट करें और हम आपकी सहायता कर सकते हैं। असेंबली का विश्लेषण किए बिना –