Integer Overflow

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

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

मूल जानकारी

इंटीजर ओवरफ्लो के मूल में कंप्यूटर प्रोग्रामिंग में डेटा टाइप की साइज द्वारा लगाई गई सीमा और डेटा की व्याख्या की सीमा होती है।

उदाहरण के लिए, एक 8-बिट असाइन्ड इंटीजर मान्यता दे सकता है 0 से 255 तक के मान। यदि आप 8-बिट असाइन्ड इंटीजर में मान 256 स्टोर करने का प्रयास करते हैं, तो इसकी स्टोरेज क्षमता की सीमा के कारण यह 0 पर वापस लौट जाएगा। उसी तरह, 16-बिट असाइन्ड इंटीजर के लिए, जो मान 0 से 65,535 तक रख सकता है, 65,535 में 1 जोड़ने से मान फिर से 0 पर वापस जाएगा।

इसके अतिरिक्त, एक 8-बिट साइन्ड इंटीजर मान्यता दे सकता है -128 से 127 तक के मान। इसका कारण यह है कि एक बिट का उपयोग साइन (सकारात्मक या नकारात्मक) को प्रतिनिधित्व करने के लिए किया जाता है, जिससे 7 बिट उत्कृष्टता को प्रतिनिधित्व करने के लिए बचते हैं। सबसे नकारात्मक संख्या को -128 (बाइनरी 10000000) के रूप में प्रतिनिधित किया जाता है, और सबसे सकारात्मक संख्या 127 (बाइनरी 01111111) है।

अधिकतम मान

संभावित वेब सुरक्षा उत्थानों के लिए अधिकतम समर्थित मानों को जानना बहुत दिलचस्प है:

fn main() {

let mut quantity = 2147483647;

let (mul_result, _) = i32::overflowing_mul(32767, quantity);
let (add_result, _) = i32::overflowing_add(1, quantity);

println!("{}", mul_result);
println!("{}", add_result);
}

इंटीजर ओवरफ्लो क्या है?

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

इंटीजर ओवरफ्लो के प्रकार:

  1. साइन्ड इंटीजर ओवरफ्लो: जब एक नकारात्मक इंटीजर वैल्यू को उसकी सीमा से अधिक बढ़ाने की कोशिश की जाती है।

  2. अनसाइन्ड इंटीजर ओवरफ्लो: जब एक धनात्मक इंटीजर वैल्यू को उसकी सीमा से अधिक बढ़ाने की कोशिश की जाती है।

इंटीजर ओवरफ्लो कैसे काम करता ह।

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

#include <stdio.h>
#include <limits.h>

int main() {
int a = INT_MAX;
int b = 0;
int c = 0;

b = a * 100;
c = a + 1;

printf("%d\n", INT_MAX);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}

उदाहरण

प्योर ओवरफ्लो

छापा गया परिणाम 0 होगा क्योंकि हमने char को ओवरफ्लो कर दिया है:

#include <stdio.h>

int main() {
unsigned char max = 255; // 8-bit unsigned integer
unsigned char result = max + 1;
printf("Result: %d\n", result); // Expected to overflow
return 0;
}

साइन्ड से अनसाइन्ड परिवर्तन

एक स्थिति का विचार करें जहाँ एक साइन्ड इंटीजर उपयोगकर्ता इनपुट से पढ़ा जाता है और फिर उसे एक संदर्भ में उपयोग किया जाता है जो इसे एक असाइन्ड इंटीजर के रूप में देखता है, सही मान्यता के बिना:

#include <stdio.h>

int main() {
int userInput; // Signed integer
printf("Enter a number: ");
scanf("%d", &userInput);

// Treating the signed input as unsigned without validation
unsigned int processedInput = (unsigned int)userInput;

// A condition that might not work as intended if userInput is negative
if (processedInput > 1000) {
printf("Processed Input is large: %u\n", processedInput);
} else {
printf("Processed Input is within range: %u\n", processedInput);
}

return 0;
}

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

अन्य उदाहरण

  • केवल 1B का उपयोग पासवर्ड के आकार को संग्रहित करने के लिए किया जाता है, इसे ओवरफ्लो करना संभव है और इसे यह महसूस कराना है कि यह 4 की लंबाई है जबकि वास्तव में यह 260 है ताकि लंबाई की जांच सुरक्षा को छल सके

  • कुछ नंबरों को देकर z3 का उपयोग करके पहले नंबर से गुणा करने पर दूसरे नंबर को देखें:

(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
  • केवल 1B का उपयोग पासवर्ड के आकार को संग्रहित करने के लिए किया जाता है, इसे ओवरफ्लो करना संभव है और इसे यह महसूस कराना है कि यह 4 की लंबाई है जबकि वास्तव में यह 260 है ताकि लंबाई की जांच सुरक्षा को छल सके और स्टैक में अगले स्थानीय चर को ओवरराइट करें और दोनों सुरक्षाओं को छल सकें

ARM64

यह ARM64 में बदलाव नहीं होता जैसा कि आप इस ब्लॉग पोस्ट में देख सकते हैं।

Last updated