2011-03-14 11 views
3

버퍼와 스택의 차이점은 무엇입니까? 버퍼 오버플로 및 스택 오버플로가 동일한 것입니까?스택 대 버퍼

감사합니다.

답변

8

스택 오버플로는 일반적으로 언 브리딩 재귀에 의해 발생합니다 (임베디드 시스템과 같이 일반적인 수준의 함수 호출을위한 충분한 스택 공간이 없거나 심지어 한계가 너무 높으면 재귀가 제한적입니다.) 아래 예 :이 예에서

void f (void) { 
    f(); 
} 
int main (void) { 
    f(); 
    return 0; 
} 

f() 함수는 매우 미련은, 그것이 결국 스택 오버플로 이어질 스택 프레임을 할당하는 것을 수행 할 때마다 자신을 호출.

반면에 버퍼 오버플로는 버퍼의 끝을 넘어 서면 발생합니다. 스택의 버퍼 오버 플로우가 종종 스택을 손상시킬 수 있기 때문에 종종 혼란 스럽지만, 기술적으로 매우 다른 것들입니다. 스택 기반 버퍼 오버 플로우의 예는 다음과 같습니다

void f (void) { 
    char str[10]; 
    strcpy (str, "This is far too long to fit"); 
} 

이 것이다 아마 손상 당신의 크기는 10 바이트의 공간에 27 문자열 (28 바이트)를 밀어 위해 노력하고 있기 때문에 스택.

그러나 버퍼 오버플로가 스택에있을 필요는 없습니다. 버퍼 오버 플로우를 제외하고 앞의 예와 마찬가지로

void f (void) { 
    char *blk = malloc (10); 
    if (blk != 0) { 
     memset (blk, ' ', 100); 
     free (blk); 
    } 
} 

를 손상되지 않습니다 버퍼가 (malloc으로 말하자면) 힙에서 할당 된 경우는, 당으로 대신 메모리 분야 쓰레기하는 좋은 기회가있다 스택. 오히려 그것은 힙의 버퍼 끝을 넘어서 쓰고 있습니다.

2

버퍼 오버플로는 버퍼의 길이를 확인하지 않거나 종료되지 않은 버퍼를 예상되는 함수 (특히 C)에 전달하는 경우입니다. 할당 된 버퍼의 끝을 지나쳐갑니다.

버퍼 오버 플로우 : 모든 스택 메모리를 사용할 때

char *foo = malloc(10); /* 10 bytes in our buffer */ 
char bar[] = "This is way bigger than 10 bytes"; 
strcpy(foo, bar); 

스택 오버 플로우입니다. 이것은 재귀 (recursion)에 의해 호출되어 스택에 너무 무언가를 할당합니다.

스택 오버 플로우 :

int foo() 
{ 
    int bar = 4; 
    foo(); 
    return 1; /* we never get here, silly */ 
}