1

실제 구현은 플랫폼에 따라 다르지만 잠재적으로 위험한 버퍼 오버 플로우의 원인입니다. 예를 들어,함수 스택이 일반적으로 '올라가는'동안 메모리의 배열이 '아래로 이동'하는 이유가 있습니까?

------------- 
| arr[0] | \ 
------------- \ 
| arr[1] | -> arr[3] is local to a function 
-------------/
| arr[2] |/
------------- 
| frame ptr | 
------------- 
| ret val | 
------------- 
| ret addr | 
------------- 
| args | 
------------- 

내 질문은, 더 나은 동사의 부족에 대한 로컬 배열, 아래로 흐르는 이유가있다? 대신 어레이가 위로 올라가려면 반환 주소를 덮어 쓰는 버퍼 오버플로 오류의 수를 크게 줄이지 않습니까?

부여 된 스레드를 사용하면 현재 호출 한 함수의 반환 주소를 덮어 쓸 수 있습니다. 하지만 지금은 무시하십시오.

답변

2

스택의 배열은 힙의 배열처럼 작동합니다. 즉, 메모리 주소가 커질수록 색인이 증가합니다.

스택이 위로 향하는 대신 아래로 (아래쪽 주소로) 자랍니다. 이로 인해 배열이 스택의 반대 방향으로 이동합니다. 코드, 힙 및 스택이 동일한 메모리 영역에있을 때부터 아마도 메모리의 각 끝에서 힙과 스택이 커지기 때문에 역사적인 이유가 있습니다.

+1

과 포인트를 둡니다.이 답변이 가장 좋습니다. 메모리 레이아웃에 대한 자세한 내용은 http://dirac.org/linux/gdb/02a-Memory_Layout_And_The_Stack.php를 참조하십시오. 스택과 힙은 사용되지 않는 메모리 주소 공간을 최대한 활용할 수 있도록 반대 방향으로 커집니다. –

0

나는 이것에 대한 출처를 인용 할 수는 없지만, 여러분이 기억을 한 발짝 내딛을 수 있다고 생각합니다. while *p++ 또는 그 라인을 따라 무엇인가를 고려하십시오.

지금, 그들은 선택의 여지가 있다면, 그들은 오히려 자신의 반환 값이 '욕심 알고리즘'에 대한 :) 토크 (HAR의 HAR)보다 다른 사람의 데이터를 덮어 줄 당신은 쉽게 while *p-- 말할 수 있지만, 그런 것 같아요

+0

내가 그렇게 생각한 것도 그 때문입니다. 하지만 컴파일러가 적절한 조정을하는 것은 그리 어렵지 않을 것입니다. 확장 성이 문제가 될 수 있습니다. – Ram

+0

컴파일러가 적절한 조정을한다는 것은 무엇을 의미합니까? – corsiKa

+0

그는 스택이 어떻게 구성되었는지에 대해 필요한 조정을하기 위해 어셈블러를 사용한다고 생각합니다. –

0

하위 배열을 사용하려면 보통 포인터 만 전달하면됩니다. 모든 인덱싱 작업은 배열의 크기를 알아야합니다. 그렇지 않으면 모든 메모리 인덱스를 거꾸로 만들지 만 동일한 경우에 자신을 얻습니다. P.

관련 문제