나는 역사가 있다고 가정하지만 왜 스택이 아래로 자 랍니까?
스택 오버플로가 커지면 버퍼 오버플로가 악용하기가 훨씬 어려워 보입니다 .
나는 역사가 있다고 가정하지만 왜 스택이 아래로 자 랍니까?
스택 오버플로가 커지면 버퍼 오버플로가 악용하기가 훨씬 어려워 보입니다 .
답변:
나는 믿는다 는 메모리가 매우 제한되었을 때, 컴퓨팅의 초창기에서 온다, 그것은 스택에 의해 전용 메모리를 미리 할당 큰 덩어리에 현명하지 않았다. 따라서 주소 0에서 힙 메모리를 위쪽으로 할당하고 메모리 끝에서 스택 메모리를 아래쪽으로 할당하면 힙과 스택이 동일한 메모리 영역을 공유 할 수 있습니다.
조금 더 많은 힙이 필요한 경우 스택 사용에주의 할 수 있습니다. 더 많은 스택이 필요한 경우 힙 메모리를 확보하려고 시도 할 수 있습니다. 스택은 때때로 힙을 덮어 쓰고 그 반대의 경우도 있기 때문에 결과는 물론 대단한 충돌이었습니다.
그 당시에는 웹 간이 없었으므로 버퍼 오버런 악용 문제는 없었습니다. (적어도 웹 간이 존재하는 정도까지는 미국 국방부의 높은 보안 시설 내에 있었기 때문에 악성 데이터의 가능성에 대해 많은 생각을 할 필요가 없었습니다.)
그 후, 대부분의 아키텍처에서는 모두 동일한 아키텍처의 이전 버전과의 호환성을 유지해야했습니다. 이것이 오늘날에도 거꾸로 쌓인 스택이 여전히 우리와 함께있는 이유입니다.
프로그램 메모리는 전통적으로
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
일부 하드웨어는 힙이 높은 메모리에서 시작하여 증가하는 반면 스택은 낮은 메모리가 증가 할 때 시작됩니다.
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의 명성은 하드웨어 디자인의 우연 일 뿐입니 까?