스택이 아래로 자라는 이유는 무엇입니까?


31

나는 역사가 있다고 가정하지만 왜 스택이 아래로 자 랍니까?

스택 오버플로가 커지면 버퍼 오버플로가 악용하기가 훨씬 어려워 보입니다 .


3
stackoverflow.com/questions/1677415/… 스택은 어느 정도 성장할 수 있습니다.
JB King

6
stackoverflow.com/questions/2035568/… 과 같은 질문이 있습니다. 사실 여기에 훨씬 더 나은 질문과 답변이 있습니다 : stackoverflow.com/questions/664744/…
Karlson

연결된 질문은 버퍼 오버플로 문제를 다루지 않습니다.
deadalnix

1
힙이 위로 커지기 때문입니다.
tylerl

2
메모리 위치가 상단 또는 하단에 0입니까?

답변:


21

나는 믿는다 는 메모리가 매우 제한되었을 때, 컴퓨팅의 초창기에서 온다, 그것은 스택에 의해 전용 메모리를 미리 할당 큰 덩어리에 현명하지 않았다. 따라서 주소 0에서 힙 메모리를 위쪽으로 할당하고 메모리 끝에서 스택 메모리를 아래쪽으로 할당하면 힙과 스택이 동일한 메모리 영역을 공유 할 수 있습니다.

조금 더 많은 힙이 필요한 경우 스택 사용에주의 할 수 있습니다. 더 많은 스택이 필요한 경우 힙 메모리를 확보하려고 시도 할 수 있습니다. 스택은 때때로 힙을 덮어 쓰고 그 반대의 경우도 있기 때문에 결과는 물론 대단한 충돌이었습니다.

그 당시에는 웹 간이 없었으므로 버퍼 오버런 악용 문제는 없었습니다. (적어도 웹 간이 존재하는 정도까지는 미국 국방부의 높은 보안 시설 내에 있었기 때문에 악성 데이터의 가능성에 대해 많은 생각을 할 필요가 없었습니다.)

그 후, 대부분의 아키텍처에서는 모두 동일한 아키텍처의 이전 버전과의 호환성을 유지해야했습니다. 이것이 오늘날에도 거꾸로 쌓인 스택이 여전히 우리와 함께있는 이유입니다.


8
역사상 더 돌아가서 힙이 없었습니다. 오늘날에도 많은 8 및 16 비트 마이크로 컨트롤러에는 힙이 없습니다. 스택이 줄어들어 프로그램을 낮은 메모리 주소에 설치할 수 있었고 스택은 나머지 메모리였습니다. 프로그램을로드하기 전에 스택 초기화를 수행하여 프로그램을 단순화 할 수 있습니다.
mattnz

1
대부분의 소형 마이크로 컨트롤러는 힙이 아닌 힙이 있습니다. 작업 할 소량의 RAM (<1KB)이있을 때 힙에서 동적 메모리 할당을 사용하는 것은 정당화하기 어렵습니다. 일반적으로 변경되는 유일한 메모리 섹션의 크기는 스택입니다.
tehnyit

7

프로그램 메모리는 전통적으로

code
constants
heap (growing up)
...
stack (growing down)

힙 및 스택 교환 가능

그러나 스택이 다른 방식으로 진행되면 버퍼 오버플로는 여전히 악용 될 수 있습니다

고전 strcpy을 예로 들어

foo(char* in){
char[100] buff;
strcpy(buff,in);
}

스택 메모리를

ret foo
arg in
buff array
ret strcpy
buf pointer
in

이것은 복사가 완료되면에 대한 리턴 주소 strcpy는 버퍼 foo의 리턴 주소가 아니라 버퍼 뒤이며 뒤에있는 내용 으로 덮어 쓸 수 있음을 의미합니다.in


4

일부 하드웨어는 힙이 높은 메모리에서 시작하여 증가하는 반면 스택은 낮은 메모리가 증가 할 때 시작됩니다.

HP의 PA-RISC 하드웨어는 다음과 같은 기능을 수행합니다. http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php

유서 깊은 멀 틱스 운영 체제가 가진 하드웨어 (아마도 중 하나)에서 실행하는 성장 스택이 다음을 참조 http://www.acsac.org/2002/papers/classic-multics.pdf , 섹션 2.3.2의 끝을 :

셋째, Multics 프로세서의 스택은 음의 방향이 아닌 양의 방향으로 커졌습니다. 이는 실제로 버퍼 오버플로를 달성 한 경우 자체 리턴 포인터가 아닌 사용되지 않는 스택 프레임을 덮어 쓰므로 악용이 훨씬 어려워집니다.

그것은 다소 흥미로운 진술입니다. "일반적인"프로 시저 호출 스택 프레임 배열 때문에 버퍼 오버 플로우가 큰 문제가 되었습니까? 또한, Totally Invulnerable이라는 Multics의 명성은 하드웨어 디자인의 우연 일 뿐입니 까?


글쎄, 실행 가능한 스택을 가지고 있지 않은 것은 아마도 Multics가 지능형 스택 방향만큼이나 도움이되었을 것입니다. 물론 PL / 1로 작성된 많은 프로그램에서 문자열 오버플로도 실제로 문제가되지 않았습니다.
Greg A. Woods
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.