2012-11-13 3 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

이것은 정확하게 해커가 의미없는 코드를 실행하기 위해 보안되지 않은 프로그램을 얻을 수있는 방법입니다. 이를 이해하려면 컴파일러, 런타임 환경 및 CPU 아키텍처에 대한 저급 지식이 필요합니다. – Jon

+1

참고 사항 : func의 주소가 0 바이트 인 경우 예상대로 작동하지 않습니다. – aaronps

답변

11

copycopy 함수는 함수의 var 버퍼를 오버 플로우 및 func 함수의 주소와 main 리턴 어드레스를 덮어.

copy 함수가 반환되면 copy 함수 호출 후에 main으로 돌아가는 대신 func 함수로 돌아갑니다.

+0

"GGGG"의 정수 값에 해당하는 주소로 돌아갑니다? – pedr0

+1

@ pedr0'GGGG'는이 과제에서'func' 함수의 주소로 대체됩니다 :'* p = (int) func;'. 'strcpy'는이 주소를 리턴 주소로 복사합니다. – ouah

+0

왜 배열'str'은 2 또는 6 대신에'int' 크기보다'var'보다 더 많은 크기를 필요로합니까? – Wilbeibi

관련 문제