Uninitialized Variables

Support HackTricks

Basic Information

यहाँ मुख्य विचार यह है कि अनइनीशियलाइज़्ड वेरिएबल्स के साथ क्या होता है क्योंकि उनके लिए असाइन की गई मेमोरी में पहले से जो मान था, वही होगा। उदाहरण:

  • Function 1: initializeVariable: हम एक वेरिएबल x घोषित करते हैं और इसे एक मान असाइन करते हैं, मान लीजिए 0x1234। यह क्रिया मेमोरी में एक स्थान आरक्षित करने और उसमें एक विशिष्ट मान डालने के समान है।

  • Function 2: useUninitializedVariable: यहाँ, हम एक और वेरिएबल y घोषित करते हैं लेकिन इसे कोई मान असाइन नहीं करते। C में, अनइनीशियलाइज़्ड वेरिएबल्स स्वचालित रूप से शून्य पर सेट नहीं होते। इसके बजाय, वे अपनी मेमोरी स्थान पर अंतिम बार संग्रहीत मान को बनाए रखते हैं।

जब हम इन दोनों फंक्शन्स को क्रमिक रूप से चलाते हैं:

  1. initializeVariable में, x को एक मान (0x1234) असाइन किया जाता है, जो एक विशिष्ट मेमोरी पते पर कब्जा करता है।

  2. useUninitializedVariable में, y घोषित किया जाता है लेकिन इसे कोई मान असाइन नहीं किया जाता, इसलिए यह x के ठीक बाद का मेमोरी स्थान लेता है। y को अनइनीशियलाइज़ करने के कारण, यह x द्वारा उपयोग किए गए उसी मेमोरी स्थान से मान "विरासत में" ले लेता है, क्योंकि वही अंतिम मान था जो वहाँ था।

यह व्यवहार निम्न-स्तरीय प्रोग्रामिंग में एक प्रमुख अवधारणा को दर्शाता है: मेमोरी प्रबंधन महत्वपूर्ण है, और अनइनीशियलाइज़्ड वेरिएबल्स अप्रत्याशित व्यवहार या सुरक्षा कमजोरियों का कारण बन सकते हैं, क्योंकि वे अनजाने में मेमोरी में छोड़े गए संवेदनशील डेटा को रख सकते हैं।

अनइनीशियलाइज़्ड स्टैक वेरिएबल्स कई सुरक्षा जोखिम पैदा कर सकते हैं जैसे:

  • डेटा लीक: संवेदनशील जानकारी जैसे पासवर्ड, एन्क्रिप्शन कुंजी, या व्यक्तिगत विवरण अनइनीशियलाइज़्ड वेरिएबल्स में संग्रहीत होने पर उजागर हो सकते हैं, जिससे हमलावरों को इस डेटा को पढ़ने की संभावना मिलती है।

  • जानकारी का खुलासा: अनइनीशियलाइज़्ड वेरिएबल्स की सामग्री प्रोग्राम की मेमोरी लेआउट या आंतरिक संचालन के बारे में विवरण प्रकट कर सकती है, जिससे हमलावरों को लक्षित हमलों को विकसित करने में मदद मिलती है।

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

  • मनमाने कोड का निष्पादन: कुछ परिदृश्यों में, हमलावर इन कमजोरियों का लाभ उठाकर प्रोग्राम के निष्पादन प्रवाह को बदल सकते हैं, जिससे उन्हें मनमाना कोड निष्पादित करने की अनुमति मिलती है, जिसमें दूरस्थ कोड निष्पादन खतरों को शामिल किया जा सकता है।

Example

#include <stdio.h>

// Function to initialize and print a variable
void initializeAndPrint() {
int initializedVar = 100; // Initialize the variable
printf("Initialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&initializedVar, initializedVar);
}

// Function to demonstrate the behavior of an uninitialized variable
void demonstrateUninitializedVar() {
int uninitializedVar; // Declare but do not initialize
printf("Uninitialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&uninitializedVar, uninitializedVar);
}

int main() {
printf("Demonstrating Initialized vs. Uninitialized Variables in C\n\n");

// First, call the function that initializes its variable
initializeAndPrint();

// Then, call the function that has an uninitialized variable
demonstrateUninitializedVar();

return 0;
}

यह कैसे काम करता है:

  • initializeAndPrint फ़ंक्शन: यह फ़ंक्शन एक पूर्णांक चर initializedVar घोषित करता है, इसे 100 का मान सौंपता है, और फिर चर के मेमोरी पते और मान को प्रिंट करता है। यह कदम सीधा है और दिखाता है कि एक प्रारंभिक चर कैसे व्यवहार करता है।

  • demonstrateUninitializedVar फ़ंक्शन: इस फ़ंक्शन में, हम एक पूर्णांक चर uninitializedVar घोषित करते हैं बिना इसे प्रारंभ किए। जब हम इसके मान को प्रिंट करने का प्रयास करते हैं, तो आउटपुट एक यादृच्छिक संख्या दिखा सकता है। यह संख्या उस मेमोरी स्थान पर पहले जो डेटा था, उसे दर्शाती है। वातावरण और संकलक के आधार पर, वास्तविक आउटपुट भिन्न हो सकता है, और कभी-कभी, सुरक्षा के लिए, कुछ संकलक स्वचालित रूप से चर को शून्य पर प्रारंभ कर सकते हैं, हालांकि इस पर भरोसा नहीं किया जाना चाहिए।

  • main फ़ंक्शन: main फ़ंक्शन उपरोक्त दोनों फ़ंक्शनों को अनुक्रम में कॉल करता है, एक प्रारंभिक चर और एक अनप्रारंभिक चर के बीच का अंतर प्रदर्शित करता है।

ARM64 उदाहरण

यह ARM64 में बिल्कुल नहीं बदलता है क्योंकि स्थानीय चर भी स्टैक में प्रबंधित होते हैं, आप इस उदाहरण की जांच कर सकते हैं जहाँ यह दिखाया गया है।

Support HackTricks

Last updated