이메일을 적으시면 보안관련 소식을 받을수 있습니다.
이메일:















요즘 회사일때문에 포스팅 해야지 해야지 한다면서 이제야 시간내서 글올리네요 
많이 부족하지만 공부하면서 정리한내용 올립니다.

1. 프로그램 실행시 메모리의 구조 
     일반적인 스택의 구조는 다음과 같습니다.

             /--------------------/ ← 메모리의 높은 숫자의 주소
                 |                         |      
                 |         Stack        |
                 |                         |
                 /------------------/
                 |                         |
                 |          Heap       |
                 |                         |
                 /--------------------/
                 |                         |
                 |         Data        |
                 |                         |
                 /--------------------/
                 |                         |
                 |          Text        |
                 |                         | 
                 /--------------------/  ← 메모리의  낮은 숫자의 주소


Heap영역이나 Data영역, Text영역에서 변수에 그 자리를 줄 때에는 "메모리의 낮은 주소"에서 부터 "메모리 높은 주소"로 순서대로 저장됩니다.

    스택이 거꾸로 자란다는 것은, 위에서 말한 다른 메모리의 영역과는 반대로 변수에 그 자리를 내어줄 때에  "메모리의 높은 주소"에서부터 "메모리 낮은 주소" 입니다.

2. 예제

 
 int a;
int b;
int c;                       //각각 a, b, c라는 전역변수가 순서대로 선언되었습니다.

int main( void )
{
   char buffer1[7];
   chat buffer2[7];  //main함수 안에서 각각 buffer1, buffer2라는 배열이 선언되었습니다.
}
 


 
                  /-------------------------/   메모리의 높은 숫자의 주소
                 |          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           |
                 /-------------------------/   메모리의  낮은 숫자의 주소
  buffer1에는 "1234567"이 들어가고 buffer2에는 "ABCDEFG"가 들어갔다고 가정한 결과의 모습입니다.


4. 함수 호출의 스택의 구조

자 이번에는 main함수 외에 다른 함수도 있고 함수에 인자가 주어진 경우에는 스택이 어떤모습인지 살펴보겠습니다.

 void function( int a, int b, int c )  //function함수에 세개의 인자가 주어져 있네요.
{
     char buffer1[5];                    //buffer1 배열을 선언
     chat buffer2[5];                    //buffer2 배열을 선언
}

int main( void )                           //main함수가 시작됩니다.
{
     int super;                              //지역변수 super 선언
     function( 1, 2, 3 );                 // function 함수에 인자 값을 주며 호출합니다. 
}


자 함수내에서 함수가 호출될 경우와 함수에 인자가 주어진 경우 스택의 모습을 살펴보았습니다.
다음 강좌에서는 오퍼플로우될때 스택의 구조에 대하여 정리하겠습니다.


****************************************************************************************************

본 포스팅의 저작권은 보안인닷컴과 작성자에 있으며 상업적 이용을 배제하며 콘텐츠 이용시에는 반드시 출처와 링크를 이용해 주시기 바랍니다. 무단도용은 저작권법에 저촉을 받습니다..

****************************************************************************************************

Posted by 비회원

댓글을 달아 주세요

  1. Favicon of http://blog.naver.com/jjysrh BlogIcon Sun2Day 2009.05.27 15:54  댓글주소  수정/삭제  댓글쓰기

    어떠한 경우라도 낮은 주소부터 높은 주소로 되는것같이 써주셨는데요

    제가 잘못알고 있는것인지 설명이 애매한것인지 문의드립니다.

    지금 위에 설명 되어 있는 부분은 little endian과 big endian을 구별할 수 없는 설명이네요.

    empty stack 과 full stack에 관해서도 언급을 해주셨으면 좋겠습니다.

  2. 아무개 2012.08.06 16:27  댓글주소  수정/삭제  댓글쓰기

    이글 가정 사항이 부족해 엉터리네요 보는 사람 헤깔리겠다