2012-04-08 12 views
7

यदि मैं जीडीबी (सी-फ्लैग के साथ संकलन के बाद) में एक सी/सी ++ प्रोग्राम चलाता हूं और मैं कुछ चर, तर्क ... आदि के पते की जांच करता हूं, और फिर मैं इसे जीडीबी के बाहर चलाता हूं (./ का उपयोग करके) पते जीडीबी में मैंने देखा जैसा ही है? यदि वे अलग हैं तो वे आम तौर पर समान होते हैं या वे काफी अलग होंगे?जीडीबी पते और "असली" पते के बीच अंतर?

मैं यह पूछता हूं क्योंकि मेरे पास एक बफर ओवरफ़्लो प्रोग्राम है जो gdb (ब्रेकपॉइंट्स के साथ और बिना) में पूरी तरह से काम करता है, हालांकि जब मैं इसे जीडीबी के बाहर चलाने की कोशिश करता हूं तो यह काम नहीं करता है।

+4

अपने बफर ओवरफ़्लो के संबंध में मैं आपको सलाह देता हूं कि आप वाल्ग्रिंड आज़माएं। – Troubadour

+1

"ulimit -c असीमित" के साथ प्रोग्राम को कोर डंप पर बल दें, फिर कोर फ़ाइल को gdb के साथ जांचें। – strkol

उत्तर

7

मैं कुछ चर, तर्क ... आदि के पते की जांच, और फिर मैं (का उपयोग कर ./) इन पतों वाले मैं gdb में देखा था के रूप में ही किया जाएगा gdb के बाहर इसे चलाने

यह निर्भर करता है।

  1. वैश्विक मुख्य निष्पादन में परिभाषित चर (एक ही पते पर रहना होगा, जब तक कि निष्पादन -fpie साथ बनाया गया है और -pie झंडे के साथ जुड़ा हुआ है।
  2. ग्लोबल अन्य साझा पुस्तकालयों में निर्धारित वेरिएबल की वजह से काफी अलग पते हो सकते हैं ASLR
  3. स्थानीय चर और मानकों ASLR के कारण कई कश्मीर बाइट्स से चारों ओर स्थानांतरित कर सकते हैं।
  4. ढेर-आवंटित चर भी काफी ASLR की वजह से स्थानांतरित कर सकते हैं, या यदि आपके प्रोग्राम मल्टी-थ्रेडेड है।

ध्यान दें कि डिफ़ॉल्ट रूप से लिनक्स पर जीडीबी डीएसगिंग को आसान बनाने के लिए एएसएलआर को अक्षम करता है। आप set disable-randomization off के साथ जीडीबी के तहत एएसएलआर पुनः सक्षम कर सकते हैं। इससे आपको जीडीबी के तहत समस्या का पुनरुत्पादन करने की अनुमति मिल सकती है।

मैं एक बफर अतिप्रवाह

यह भी ध्यान रखें है, कि Valgrind और Address Sanitizer उपकरण की तरह अक्सर काफी GDB के तहत चलाने की तुलना में बफर अतिप्रवाह को खोजने के लिए अधिक प्रभावी हैं। विशेष रूप से पता Sanitizer महान है जिसमें यह ग्लोबल्स और स्टैक पर बफर ओवरफ्लो पाता है (Valgrind नहीं करता है)।

0

-g ध्वज के साथ संकलन कोड आकार को बढ़ाता है क्योंकि यह निष्पादन योग्य अतिरिक्त जानकारी में जाता है।

आपकी बफर समस्या के रूप में यह कोड के एक स्निपेट को प्रकाशित करने में मदद करेगा जहां चीजें बहुत खराब हो रही हैं।

2

आपको कभी यह नहीं मानना ​​चाहिए कि एक निश्चित कोड या वर्र्स एक निश्चित स्थान पर स्थित होंगे।

यह अतीत में सबसे ओएस में सच था लेकिन यह एक सुरक्षा छेद है। दुर्भावनापूर्ण सॉफ़्टवेयर प्रोग्रामों को घुमाने के लिए इसका उपयोग करता है। ओएस सुरक्षा बढ़ाने के लिए पते को धक्का देगी।

+2

मैं बस उल्लेख करने वाला था [पता स्थान लेआउट यादृच्छिकरण (एएसएलआर)] (http://en.wikipedia.org/wiki/Address_space_layout_randomization)। – Blastfurnace

+0

कोई * सुरक्षित रूप से * मान सकता है कि स्थिति-निर्भर निष्पादन योग्य में, सभी वैश्विक चर एक निष्पादन से दूसरे निष्पादन में एक ही निश्चित पते पर बने रहेंगे। –

+1

@ नियोजित रूसी: मैं इसकी अपेक्षा नहीं करता। आप ऐसा क्यों सोचते हैं? –

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