Uninitialized Variables
मूल जानकारी
यहाँ की मूल विचारधारा यह है कि अअनिश्चित चर के साथ क्या होता है क्योंकि उनके पास पहले से ही निर्धारित मेमोरी में मौजूद मूल्य होता है। उदाहरण:
कार्य 1:
initializeVariable
: हम एक चरx
की घोषणा करते हैं और उसे एक मूल्य देते हैं, चलो कहें0x1234
। यह कार्रवाई मेमोरी में एक स्थान आरक्षित करने और उसमें एक विशिष्ट मूल्य डालने के समान है।कार्य 2:
useUninitializedVariable
: यहाँ, हम एक और चरy
की घोषणा करते हैं लेकिन उसे कोई मूल्य नहीं देते। C में, अअनिश्चित चर स्वचालित रूप से शून्य पर सेट नहीं होते। बजाय इसके, वे उस मेमोरी स्थान पर जो उनके मेमोरी स्थान पर अंतिम बार स्टोर किया गया था, उसी मूल्य को बनाए रखते हैं।
जब हम इन दो कार्यों को क्रमशः चलाते हैं:
initializeVariable
में,x
को एक मूल्य (0x1234
) दिया जाता है, जो एक विशिष्ट मेमोरी पते को अधिक करता है।useUninitializedVariable
में,y
की घोषणा की जाती है लेकिन कोई मूल्य नहीं दिया जाता है, इसलिए यहx
के बाद के मेमोरी स्थान को लेता है।y
को अअनिश्चित करने के कारण, यह उसी मेमोरी स्थान से मूल्य "विरासत" प्राप्त करता है जिसेx
द्वारा उपयोग किया गया था, क्योंकि वहां अंतिम मूल्य था।
यह व्यवहार कम स्तरीय प्रोग्रामिंग में एक महत्वपूर्ण अवधारणा को दर्शाता है: मेमोरी प्रबंधन महत्वपूर्ण है, और अअनिश्चित चर अप्रत्याशित व्यवहार या सुरक्षा संवर्धन की ओर ले जा सकते हैं, क्योंकि वे अज्ञातता से मेमोरी में छोड़े गए संवेदनशील डेटा को अनजाने में रख सकते हैं।
अअनिश्चित स्टैक चर कई सुरक्षा जोखिम पैदा कर सकते हैं जैसे:
डेटा लीकेज: अअनिश्चित चर में संवेदनशील जानकारी जैसे पासवर्ड, एन्क्रिप्शन कुंजी, या व्यक्तिगत विवरण संवेदनशील हो सकते हैं, जिससे हमलावरों को इस डेटा को पढ़ने की संभावना हो सकती है।
जानकारी भेदन: अअनिश्चित चर की सामग्री प्रोग्राम की मेमोरी लेआउट या आंतरिक परिचालन के बारे में विवरण उजागर कर सकती है, जिससे हमलावरों को निश्चित उत्पादन किए गए उत्पादों के लिए निर्देशित दुरुपयोग विकसित करने में मदद मिल सकती है।
क्रैश और अस्थिरता: अअनिश्चित चर का उपयोग करने वाले आवेदन अपरिभाषित व्यवहार में परिणामित हो सकते हैं, जिससे कार्यक्रम क्रैश या अप्रत्याशित परिणाम हो सकते हैं।
मनमानी कोड निष्पादन: कुछ स्थितियों में, हमलावर इन भेदनशीलताओं का शोषण कर सकते हैं ताकि वे कार्यक्रम के निष्पादन प्रवाह को बदल सकें, जिससे उन्हें मनमानी कोड निष्पादन करने की क्षमता प्राप्त हो सकती है, जिसमें दूरस्थ कोड निष्पादन खतरे शामिल हो सकते हैं।
उदाहरण
कैसे यह काम करता है:
initializeAndPrint
फ़ंक्शन: यह फ़ंक्शन एक पूर्णांक चरinitializedVar
की घोषणा करती है, उसे मान100
देती है, और फिर चर के मेमोरी पते और मान दोनों को प्रिंट करती है। यह कदम सीधा है और दिखाता है कि एक पूर्णांक चर का व्यवहार कैसा होता है।demonstrateUninitializedVar
फ़ंक्शन: इस फ़ंक्शन में, हम एक पूर्णांक चरuninitializedVar
की घोषणा करते हैं बिना इसे प्रारंभ किए। जब हम इसका मान प्रिंट करने का प्रयास करते हैं, आउटपुट में एक यादृच्छिक संख्या दिख सकती है। यह संख्या वह कोई डेटा हो सकती है जो पहले उस मेमोरी स्थान पर था। आवार्डन और कंपाइलर के आधार पर, वास्तविक आउटपुट भिन्न हो सकता है, और कभी-कभी, सुरक्षा के लिए, कुछ कंपाइलर स्वचालित रूप से चरों को शून्य पर प्रारंभ कर सकते हैं, हालांकि इस पर भरोसा नहीं किया जाना चाहिए।main
फ़ंक्शन:main
फ़ंक्शन ऊपर दिए गए दोनों फ़ंक्शनों को क्रम में बुलाता है, जो एक पूर्णांक चर और एक अप्रारंभित चर के बीच विरोध को दर्शाता है।
ARM64 उदाहरण
यह ARM64 में किसी भी प्रकार से नहीं बदलता क्योंकि स्थानीय चर स्टैक में भी प्रबंधित होते हैं, आप इस उदाहरण की जाँच कर सकते हैं जहाँ यह दिखाया गया है।
Last updated