2011-11-20 10 views
5

के लिए प्रोग्राम काउंटर नहीं है, मैं किसी दिए गए कमजोर कोड के लिए बफर ओवरफ़्लो आक्रमण करने की कोशिश कर रहा हूं। लेकिन ऐसा लगता है कि यह गलत हो रहा है क्योंकि, हालांकि मेरे शोषण तार स्टैक को भ्रष्ट नहीं करते हैं, लेकिन मुझे अपना असेंबली कोड (शोषण स्ट्रिंग में एम्बेडेड) नहीं मिल सकता है।कोई फ़ंक्शन चयनित फ्रेम

प्रोग्राम के 'रिट' निर्देश के निष्पादन से पहले स्मृति मानों का टुकड़ा यहां है जिसे मैं हमला करना चाहता हूं।

0x55683984:  0x5568398c 0x...(old r.a)  0x68e322a1  0x0000c31c 
0x55683994:  0xf7fa9400  0x0804a3d7  0x556839c0  0xf7e518d0 

इस बिंदु पर, कोई बात बिगड़ जाए, क्योंकि यह ढेर पॉप नहीं कर सकते हैं और पॉपअप मूल्य के लिए% EIP बिंदु बनाने के? तो मेरा शोषण असेंबली कोड काम नहीं करता है। (0x68e322a1 0x0000c31c) जीडीबी का कहना है कि कोई फ़ंक्शन चयनित फ्रेम के लिए प्रोग्राम काउंटर नहीं है। और जब मैं इसे डिबगिंग के बिना निष्पादित करने का प्रयास करता हूं, तो यह विभाजन खंड का कारण बनता है।

क्या इस समस्या में मेरी असेंबली की लंबाई के साथ कुछ करना है? (इस मामले में यह 6 है)?

Program received signal SIGSEGV, Segmentation fault. 
0x5568398c in ??() 
(gdb) x 0x5568398c 
0x5568398c: 0x68e322a1 

यह कैसे हो सकता है जब मैं यह देखने में सक्षम हूं कि पते के अंदर क्या है जो segfault का कारण बनता है?

+0

आप या 'एक्स/10i $ eip' कोड जहां यह segfaulted और देखने के लिए' bt' देखने पर 'disassemble' उपयोग कर सकते हैं कॉल स्टैक। यदि आप जिस कोड को निष्पादित करने का प्रयास कर रहे हैं, उसे दिखाया गया है तो यह मदद करना आसान होगा (यदि यह 68 ई 3 है .. ऐसा लगता है कि इसमें एक शून्य शून्य बाइट एम्बेडेड है)। बीटीडब्लू, अगर यह होमवर्क के लिए है तो आपको इसे इस तरह चिह्नित करना चाहिए। – user786653

+0

मैंने यह देखने के लिए लेआउट एएसएम का उपयोग किया कि क्या हो रहा है और इससे मदद नहीं मिली। इसके अलावा, अब मेरा शोषण कोड एक सी 3 के साथ समाप्त हुआ (जिसका अर्थ है रीट निर्देश), एक शून्य शून्य बाइट कोई समस्या नहीं है। यहां मुख्य बिंदु यह है कि मैं गलती से एक स्मृति पते तक पहुंचने की कोशिश कर रहा हूं जो संभवतः अपरिभाषित है। – bfaskiplar

उत्तर

3

ठीक है, यह कहानी है कि मैं अपने असेंबली कोड में movl निर्देश में पते के सामने '$' रखने के लिए भूल गया था। इस प्रकार, प्रोग्राम एक अपरिभाषित स्मृति पते तक पहुंचने का प्रयास कर रहा था जो सेगमेंटेशन गलती का कारण बनता है।

लेकिन, मुझे जिस तरह से GDB कह कर इस स्थिति को सूचित करता है पसंद नहीं है सिर्फ

+0

धन्यवाद आदमी, आपने मेरा बेकन – JustGage

5

डिफ़ॉल्ट वर्तमान समारोह का कोड बाहर disassemble प्रिंट करके 'कोई समारोह चयनित फ्रेम के लिए कार्यक्रम काउंटर शामिल'। आपके मामले में प्रोग्राम काउंटर कहीं स्टैक करने के लिए इंगित करता है और जीडीबी समझ नहीं पाएगा कि वर्तमान फ़ंक्शन की सीमाएं कहां हैं। यही कारण है कि त्रुटि संदेश।

लेकिन आप मैन्युअल रूप से पतों की एक श्रेणी एकत्रित न करने के लिए निर्दिष्ट कर सकते हैं:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff 
+1

बचाया बहुत अच्छी चाल है। वैकल्पिक रूप से, आप $ rip, $ rip + ऑफसेट को अलग-अलग उपयोग कर सकते हैं जो आपके स्टैक फ्रेम को कहां निकालने के दर्द को आसान बनाता है – Eric

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