2013-03-19 6 views
15

क्या जीसीसी बफर ओवरफ्लो हमले को रोकने के लिए समझदारी से स्मृति आवंटन करता है?जीसीसी मेमोरी आवंटन समस्या - बफर ओवरफ्लो हमला

int function(char *str) { 
    int a = 0;     // See the 
    char b[16] = "abcd";  // changes here 

    if(!strcmp(b, str)) 
     a = 1; 

    return a; 
} 

और

int function(char *str) { 
    char b[16] = "abcd";  // See the 
    int a = 0;     // changes here 

    if(!strcmp(b, str)) 
     a = 1; 

    return a; 
} 

जब मैं gdb के साथ यह डिबग, यह हमेशा चर और फिर चरित्र सरणी पूर्णांक पहले स्मृति को आबंटित; कोई फर्क नहीं पड़ता कि परिवर्तनीय घोषणा का क्रम क्या है। यानी दोनों मामलों में, कंपाइलर पहले स्मृति को a और फिर b पर आवंटित करता है।

(higher address) 
    Memory 
|  | 
|  | 
+--------+ 
|  | 
|  | 
|  | 
|  | 
+--------+ <----- b (16 bytes) 
|  | 
+--------+ <----- a (4 bytes) 
|  | 
(lower address) 

तो, भले ही हम str में 16 से अधिक चरित्र की आपूर्ति, यह a का मूल्य को प्रभावित नहीं कर सकते हैं। क्या कोई मेरी मदद कर सकता है?

धन्यवाद।

+1

_ मानक_ किसी भी उद्देश्य के लिए इस तरह की पुनरावृत्ति की अनुमति देता है, संकलक पूरा करना चाहता है। सबसे आम - अनुकूलन। यह अभी भी "खुफिया" है, लेकिन "बफर ओवरफ्लो आक्रमण" को रोकने के लिए नहीं। और यह अभी भी एक _undefined व्यवहार_ (बफर ओवरफ़्लो) –

उत्तर

11

हां, -fstack-protector ध्वज के साथ चलाएं।

ध्वज के साथ चलते समय, जीसीसी स्टैक कैनरी जोड़ता है, स्टैक फ्रेम के उच्चतम भाग में सरणी चर को प्रकार देता है ताकि उन्हें ओवरफ्लो करना और अन्य चर को दूषित कर सकें, और फ़ंक्शन तर्कों की प्रतियां संग्रहीत करने के लिए बनाता है अन्य स्थानीय

अधिक जानकारी के लिए Wikipedia page on Buffer overflow protection और ProPolice होमपेज पर देखें

+0

@ रवि: कुछ वितरण डिफ़ॉल्ट रूप से इसे सक्षम करते हैं। '-फनो-स्टैक-रक्षक' के साथ संकलन करने का प्रयास करें और देखें कि इससे कोई फर्क पड़ता है या नहीं। – Hasturkun

+0

@MM .: जोड़ा गया। ज्यादातर ब्रेवटी के लिए छोड़ दिया गया था। – Hasturkun

+1

आप सही हैं। जीसीसी इसे डिफ़ॉल्ट रूप से सक्षम बनाता है। यदि हम '-फनो-स्टैक-रक्षक' के साथ संकलित करते हैं, तो यह स्टैक फ्रेम_ के उच्चतम भाग में _array चर के बजाय घोषणा के क्रम में क्रमशः स्मृति आवंटित करता है। धन्यवाद – Ravi

-1

क्या जीसीसी बफर ओवरफ्लो हमले को रोकने के लिए समझदारी से स्मृति आवंटन करता है?

नहीं, ऐसा नहीं है। आप बिना किसी जांच के किसी हमले या बफर ओवरफ़्लो को रोक नहीं सकते हैं, जो हमेशा संभव नहीं होता है। तथ्य के बाद आप कभी-कभी ओवरफ्लो का पता लगा सकते हैं।

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

+2

यह गलत है, जीसीसी बफर ओवरफ़्लो – Hasturkun

+0

@Hasturkun के प्रभावों को रोकने के लिए चर को पुन: व्यवस्थित कर सकता है आप सीमाओं की जांच किए बिना ओवरफ़्लो को रोक नहीं सकते हैं। आप कभी-कभी कभी एक का पता लगा सकते हैं। –

+0

यह सच है। लेकिन आप ProPolice, आदि द्वारा किए गए अनुसार उन्हें कम कर सकते हैं। – Hasturkun

2

यहां तक ​​कि अगर जीसीसी बफर अतिप्रवाह के खिलाफ की रक्षा करने के लिए इस तरह के एक सुविधा है, यहाँ कई अन्य कारणों एक निश्चित चर घोषणा आदेश का कारण हो सकता है कि कर रहे हैं। जहां घोषणा की जाती है वह वास्तव में महत्वपूर्ण नहीं है, संकलक रनटाइम में कब और कैसे उपयोग किया जाता है, इस आधार पर आवंटन निर्णय लेगा।

सबसे महत्वपूर्ण बात यह है कि कंपाइलर आशा करता है कि स्टैक फ्रेम में चर को संभवतः सर्वोत्तम संभव संरेखण के साथ आवंटित किया जाएगा। यह सीपीयू और अनुकूलन सेटिंग के आधार पर पूरी तरह से अलग तरीकों से बनाया जा सकता है। स्मृति की खपत के अनुकूलन की तुलना में गति के लिए अनुकूलित एक पूरी तरह से अलग आवंटन दे सकता है। और सबसे अधिक संभावना है, यह सीपीयू रजिस्टरों में कुछ चर डाल देगा, पूरे रैम आवंटन की आवश्यकता को हटा देगा।

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

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