요즘 회사일때문에 포스팅 해야지 해야지 한다면서 이제야 시간내서 글올리네요
많이 부족하지만 공부하면서 정리한내용 올립니다.
1. 프로그램 실행시 메모리의 구조
일반적인 스택의 구조는 다음과 같습니다.
/--------------------/ ← 메모리의 높은 숫자의 주소 | | | Stack | | | /------------------/ | | | Heap | | | /--------------------/ | | | Data | | | /--------------------/ | | | Text | | | /--------------------/ ← 메모리의 낮은 숫자의 주소 |
Heap영역이나 Data영역, Text영역에서 변수에 그 자리를 줄 때에는 "메모리의 낮은 주소"에서 부터 "메모리 높은 주소"로 순서대로 저장됩니다.
스택이 거꾸로 자란다는 것은, 위에서 말한 다른 메모리의 영역과는 반대로 변수에 그 자리를 내어줄 때에 "메모리의 높은 주소"에서부터 "메모리 낮은 주소" 입니다.
2. 예제
int a; int b; int c; //각각 a, b, c라는 전역변수가 순서대로 선언되었습니다. int main( void ) |
/-------------------------/ 메모리의 높은 숫자의 주소 | ret ① | | | | sfp(4byte)② | | | Stack | buffer1 ③ | | | | buffer2 ④ | /-------------------------/ | | Heap /-------------------------/ | c ③ | | b ② | Data | a ① | /-------------------------/ | | Text /-------------------------/ 메모리의 낮은 숫자의 주소 |
스택영역과 데이타영역을 비교해보니 '스택은 거꾸로 자란다'는 말이 이해되시죠? 먼저 선언된 순서에 따라 메모리에 자리를 잡는데 Data영역과 Stack영역이 반대로 진행되었습니다.
다시 한번 더 말하자면, 데이터영역은 변수가 선언된 순서대로 메모리의 낮은 주소에서 시작해서 할당이 되는데, 스택영역에서는 먼저 선언된 변수가 메모리 높은 주소에서 시작해서 할당 받는 것입니다.
3. 스택의 데이터 입력후 구조
/-------------------------/ 메모리의 높은 숫자의 주소 | ret | /-------------------/ | sfb(4byte) | /-------------------/ | 7 | | 6 | | 5 | | 4 | buffer1 | 3 | | 2 | | 1 | /-------------------/ Stack | G | | F | | E | | D | buffer2 | C | | B | | A | /-------------------------/ 메모리의 낮은 숫자의 주소 |
4. 함수 호출의 스택의 구조
자 이번에는 main함수 외에 다른 함수도 있고 함수에 인자가 주어진 경우에는 스택이 어떤모습인지 살펴보겠습니다.
void function( int a, int b, int c ) //function함수에 세개의 인자가 주어져 있네요. int main( void ) //main함수가 시작됩니다. |
자 함수내에서 함수가 호출될 경우와 함수에 인자가 주어진 경우 스택의 모습을 살펴보았습니다.
다음 강좌에서는 오퍼플로우될때 스택의 구조에 대하여 정리하겠습니다.
본 포스팅의 저작권은 보안인닷컴과 작성자에 있으며 상업적 이용을 배제하며 콘텐츠 이용시에는 반드시 출처와 링크를 이용해 주시기 바랍니다. 무단도용은 저작권법에 저촉을 받습니다..
****************************************************************************************************