मैंने पायथाग्रास के जवाब में एक टिप्पणी में "बफर ओवरफ्लो" का उल्लेख किया, मुझे शायद स्पष्ट करना चाहिए कि मेरा क्या मतलब था। सी में, यह जानना पर्याप्त नहीं है कि सीधे मेमोरी के साथ काम करना खतरनाक है - आपको उन सटीक तरीकों को भी समझना चाहिए जिनमें यह खतरनाक है। मुझे वास्तव में इन सभी मामलों के लिए "पैर में अपने आप को गोली मारना" रूपक पसंद नहीं है - बहुत समय, यह आप ट्रिगर को नहीं खींच रहा है, लेकिन अक्सर यह आपके और / या आपके उपयोगकर्ताओं के विपरीत हितों वाला एक अभिनेता है। ।
उदाहरण के लिए, एक अवरोही स्टैक के साथ एक आर्किटेक्चर में (सबसे लोकप्रिय आर्किटेक्चर इस बिल को फिट करते हैं - x86 और एआरएम आमतौर पर शामिल होते हैं), जब आप एक फ़ंक्शन को कॉल करते हैं, तो फ़ंक्शन के लिए रिटर्न पता स्थानीय चर में परिभाषित होने के बाद स्टैक पर रखा जाएगा । समारोह का शरीर। इसलिए यदि आप बफर को स्थानीय चर के रूप में घोषित करते हैं, और उस चर को इस तरह से बफर ओवरफ्लो की जांच के बिना बाहरी दुनिया में उजागर करते हैं:
void myFn(void) {
char buf[256];
gets(buf);
}
एक बाहरी उपयोगकर्ता आपको एक स्ट्रिंग भेज सकता है जो स्टैक से रिटर्न एड्रेस को ओवरराइट करता है - मूल रूप से, वह कॉल-ग्राफ़ के आपके प्रोग्राम के रन-टाइम विचार को बदल सकता है जो वर्तमान फ़ंक्शन का नेतृत्व करता है। तो उपयोगकर्ता आपको एक स्ट्रिंग देता है जो आपके आर्किटेक्चर के लिए कुछ निष्पादन योग्य कोड का द्विआधारी प्रतिनिधित्व करता है, स्टैक को ओवरफ्लो करने के लिए पर्याप्त पैडिंग myFn
और रिटर्न myFn
कोड को इंगित करने के लिए कुछ अतिरिक्त डेटा जो उसने आपको दिया था। यदि ऐसा होता है, तो जब myFn
आमतौर पर इसके कॉलर पर नियंत्रण वापस आ जाता है, तो यह बदले में उस दुर्भावनापूर्ण उपयोगकर्ता को कोड करने के लिए शाखा देगा। यदि आप C (या C ++) कोड लिखते हैं जिसमें अविश्वसनीय उपयोगकर्ताओं के संपर्क में आने की संभावना है, तो आपको इस हमले के वेक्टर को समझने की आवश्यकता है। आपको यह समझना चाहिए कि ढेर के खिलाफ एक बफर अतिप्रवाह अक्सर (लेकिन हमेशा नहीं) हीप के खिलाफ एक से अधिक आसानी से शोषक है, और आपको यह समझना चाहिए कि ढेर में मेमोरी कैसे रखी जाती है (बहुत अधिक विस्तार से नहीं, आवश्यक रूप से, लेकिन विचार करें कि malloc()
'एड क्षेत्र में नियंत्रण संरचनाएं होती हैं, जो यह समझने में मदद करती हैं कि आपका प्रोग्राम दूसरे malloc()
, या में क्रैश क्यों होता है free()
।
C आपकी मशीन के काम करने के तरीके के बारे में आपको निम्न-स्तरीय विवरणों से अवगत कराता है, और यह आज आपको व्यापक उपयोग में किसी भी अन्य उपयोगकर्ता-संपादित भाषा की तुलना में आपकी मशीन पर अधिक प्रत्यक्ष नियंत्रण प्रदान करता है। महान शक्ति के साथ बड़ी जिम्मेदारी आती है - आपको वास्तव में सी-सुरक्षित और प्रभावी ढंग से काम करने के लिए उन निम्न-स्तरीय विवरणों को समझना होगा।