2012-11-13 18 views
8

नीचे दिए गए कोड का आउटपुट "ओवरफ़्लो" है, लेकिन मैंने स्पष्ट रूप से func फ़ंक्शन को कॉल नहीं किया था। यह कैसे काम करता है?इस कोड को समझाओ जो इसे स्पष्ट रूप से कॉल किए बिना फ़ंक्शन चलाता है?

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int copy(char *input) 
{ 
    char var[20]; 
    strcpy(var, input); 
    return 0; 
} 

int func(void) 
{ 
    printf("Overflow\n"); 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    char str[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGG"; 
    int *p = (int *)&str[24]; 
    *p = (int)func; 

    copy(str); 
    return 0; 
} 
+3

आपका मतलब बफर ओवरफ़्लो है ...? – JosephH

+3

यह ठीक है कि एक हैकर कोड को निष्पादित करने के लिए एक असुरक्षित प्रोग्राम कैसे प्राप्त कर सकता है जिसका अर्थ यह नहीं था। इसे समझने के लिए कंपाइलर, रनटाइम पर्यावरण, और सीपीयू आर्किटेक्चर के निम्न स्तर के ज्ञान की आवश्यकता होती है। – Jon

+1

यह ध्यान दें: यदि func के पते में शून्य बाइट है, तो यह काम नहीं करेगा जैसा आप उम्मीद करते हैं। – aaronps

उत्तर

11

copy समारोह copy समारोह में var बफर overflows और func समारोह के पते के साथ main वापसी पता अधिलेखित कर देता है।

copy समारोह रिटर्न, बजाय copy समारोह कॉल के बाद main की ओर लौटने के लिए, यह func समारोह में लौट सकते हैं।

+0

यह "जीजीजीजी" के पूर्णांक मूल्य से संबंधित पते पर वापस आ जाएगा? – pedr0

+1

@ pedr0 'GGGG' को इस असाइनमेंट में 'func' फ़ंक्शन के पते से प्रतिस्थापित किया गया है:' * p = (int) func; '। 'Strcpy' इस पते को वापसी पते पर कॉपी करेगा। – ouah

+0

सरणी 'str' को 4 या 6 के बजाय' var' से अधिक 4 'int' आकार की आवश्यकता क्यों है? – Wilbeibi

संबंधित मुद्दे

 संबंधित मुद्दे