2011-02-05 13 views
7

मैं एक स्कूल परियोजना के लिए के साथ सी # एक बफर अतिप्रवाह बनाने के लिए कोशिश कर रहा हूँ बनाने #:सी बफर अतिप्रवाह

unsafe 
{ 
    fixed (char* ptr_str = new char[6] {'H', 'a', 'l', 'l', 'o', ','}) 
    { 
     fixed (char* ptr_str2 = new char[6] {'W', 'e', 'r', 'e', 'l', 'd'}) 
     { 
      fixed (char* ptr_str3 = new char[6] {'!', '!', '!', '!', '!', '!'}) 
      { 
       for (int i = 0; i < 8; i++) 
       { 
        ptr_str2[i] = 'a'; 
       } 

       for (int i = 0; i < 6; i++) 
       { 
        this.Label2.Text += ptr_str[i]; 
        this.Label3.Text += ptr_str2[i]; 
        this.Label4.Text += ptr_str3[i]; 
       } 
      } 
     } 
    } 
} 

मुझे लगा कि यह ptr_str में ptr_str2 और इस तरह अधिलेखन वर्ण बाढ़ जाएगा। हालांकि ऐसा प्रतीत नहीं होता है। यह निष्पादित करता है लेकिन ptr_str में मान ओवरराइट नहीं किए जाते हैं।

क्या कोई इसे प्राप्त करने में सहायता कर सकता है? मुझे समझ में नहीं आता कि मैं क्या गलत कर रहा हूं।

+1

मुझे लगता है कि आप एएसपी .NET MVC 2 प्रोजेक्ट से शुरू कर सकते हैं ... –

+2

हम उनसे बचने की कोशिश कर रहे हैं, आप एक बनाने की कोशिश कर रहे हैं ... अजीब दुनिया हम रहते हैं। – alex

+6

यह एक * बफर होगा ओवरफ्लो *, एक ढेर ओवरफ्लो नहीं। –

उत्तर

5

आप इस तथ्य को याद कर रहे हैं कि सरणी स्वयं वस्तुएं हैं। उनके पास किसी ऑब्जेक्ट हेडर की तरह किसी भी प्रबंधित संदर्भ प्रकार और एक निजी फ़ील्ड है जो सरणी आकार को संग्रहीत करता है। सरणी तत्वों को ओवरराइट करना शुरू करने से पहले आपको उनको पहले ओवरराइट करना होगा। एक 32-बिट मशीन पर, आप इस के साथ ptr_str2 के पहले तत्व अधिलेखन शुरू करेंगे:

     for (int i = 0; i < 13; i++) { 
          ptr_str[i] = 'a'; 
         } 
बेशक

, यह 13.

पाश के लिए पर एक ब्रेकपाइंट सेट करके ऐसा निरीक्षण होना ही था । डीबग + विंडोज + मेमोरी + मेमोरी 1, पता बॉक्स में "ptr_str" टाइप करें। स्मृति को बदलने के लिए कोड को चरणबद्ध करें। आप इसके बाद ptr_str2 देखेंगे, सिंकब्लैक के लिए 4 बाइट, विधि तालिका पॉइंटर के लिए 4 बाइट और सरणी लंबाई के लिए 4 बाइट्स देखेंगे। 12 बाइट कुल, 6 वर्ण।

+0

अरे यह एक अद्भुत अच्छी नोक है। मुझे अभी तक मेमोरी विंडो नहीं मिली ..: पी लेकिन अब मुझे लगता है कि मुझे ptr_str3 अनुक्रम को ओवरराइट करने की आवश्यकता है ... छोटी गलती। अब मुझे यह जांचना होगा कि मैं क्रैश के बिना हेडर मानों को कैसे ओवरराइट कर सकता हूं। – BigChief

+0

हम्म, वहां मत जाओ। अगला कचरा संग्रह सरणी को फिर से व्यवस्थित करने जा रहा है। वे केवल दुर्घटना से स्मृति में आसन्न रहेंगे। –

+0

हम्म ... ठीक है लेकिन कचरा केवल तब नहीं एकत्र किया जाता है जब सरणी की आवश्यकता नहीं होती है ?? प्रतीत होता है कि चाल चल रही है। (int i = 0; i <36; i ++) { अगर (i == 6) i + = 24; ptr_str2 [i] = 'a'; } – BigChief

6

स्टैक ओवरफ़्लो कॉलिंग स्टैक का ओवरफ़्लो है। यह बहुत आसान किया जाता है:

int Test() 
{ 
    return Test(); 
} 

Console.WriteLine (Test()); 

यदि आप मतलब बफर अतिप्रवाह, वहाँ है एक similar question

+0

हाँ मेरा मतलब एक बफर प्रवाह था जहां आप ढेर पर एक चर को ओवरराइट करते हैं, ढेर पर नहीं। – BigChief

+1

हां जो ढेर चर (structs) बह रहा है। मैं जानना चाहता हूं कि यह स्टैक चर के साथ कैसे किया जा सकता है। जहां ptr_str2 ptr_str2 ptr_str3 ओवरराइटिंग ptr_str3 के बजाय ptr_str को ओवरराइट करता है। – BigChief

0

आप यहां एक स्टैक ओवरफ्लो नहीं बना रहे हैं - आप वास्तव में स्टैक का उपयोग नहीं कर रहे हैं। आप एक बफर ओवरफ्लो बनाने की कोशिश करने के बजाय प्रतीत होते हैं, मुझे लगता है कि असुरक्षित सी # सी की तरह है, जो यह समान है लेकिन कई महत्वपूर्ण अंतरों के साथ।

एक stackoverflow बस बनाया जा सकता है:

public void Stackoverflow() 
{ 
    Stackoverflow(); 
} 

और फिर Stackoverflow() कहीं फोन करके।

+0

लिटिल फिक्स: 'स्टैक ओवरफ्लो() वापसी करें या फिर इसे' शून्य 'बनाएं। –

+0

@gaearon: धन्यवाद। –

+0

लेकिन यदि आप निष्पादित कर रहे हैं (सुरक्षित) int i = 99; आप ढेर का उपयोग कर रहे हैं? – BigChief

6

पारंपरिक हमला जो बफर ओवरफ्लो का शोषण करता है स्टैक बफर; आप ढेर बफर बह रहे हैं। जब वे दोनों स्टैक पर हों तो एक बफर को तोड़ने के लिए एक बफर को लिखना बहुत आसान होता है। ढेर में आवंटन को मजबूर करने के लिए नए चार के बजाय स्टैकलॉक का उपयोग करने का प्रयास करें।

+0

आपकी सलाह के लिए धन्यवाद। मैं पहले से ही सोच रहा था कि मुझे कुछ गलत समझ आया। मैं स्टैकलोक की जांच कर रहा हूँ। – BigChief

+0

स्टैकलोक को छोड़कर वास्तव में आपको बफर को बहने नहीं देगा :) –

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