Uninitialized Variables

htARTE (HackTricks AWS Red Team Expert) से शून्य से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

यहाँ की मूल विचारधारा यह है कि अअनिश्चित चर के साथ क्या होता है क्योंकि उनके पास पहले से ही निर्धारित मेमोरी में मौजूद मूल्य होता है। उदाहरण:

  • कार्य 1: initializeVariable: हम एक चर x की घोषणा करते हैं और उसे एक मूल्य देते हैं, चलो कहें 0x1234। यह कार्रवाई मेमोरी में एक स्थान आरक्षित करने और उसमें एक विशिष्ट मूल्य डालने के समान है।

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

जब हम इन दो कार्यों को क्रमशः चलाते हैं:

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

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

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

अअनिश्चित स्टैक चर कई सुरक्षा जोखिम पैदा कर सकते हैं जैसे:

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

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

  • क्रैश और अस्थिरता: अअनिश्चित चर का उपयोग करने वाले आवेदन अपरिभाषित व्यवहार में परिणामित हो सकते हैं, जिससे कार्यक्रम क्रैश या अप्रत्याशित परिणाम हो सकते हैं।

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

उदाहरण

#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 में किसी भी प्रकार से नहीं बदलता क्योंकि स्थानीय चर स्टैक में भी प्रबंधित होते हैं, आप इस उदाहरण की जाँच कर सकते हैं जहाँ यह दिखाया गया है।

Last updated