Mylabs

Stack 의 구조 - Call문의 동작과 스택의 생성 본문

RCE

Stack 의 구조 - Call문의 동작과 스택의 생성

[Edge] 2009. 5. 1. 13:05


스택의 구조를 설명하기 위해, 다음의 글을 번역하였다.
http://www.phrack.com/issues.html?issue=49&id=14&mode=txt

내용은 함수가 호출되는 Call 문에 대한 부분만 정리하였으며,
나머지 스택의 대한 자세한 부분들은 공개되어 있는 많은 BOF문서나,
스택 문서를 참조하면 기본적인 사항에 대해 접할 수 있다.

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

void main() {
  function(1,2,3);
}
 
 $ gcc -S -o example1.s example1.c
 gcc 에서 컴파일시 -S를 사용하여 어셈코드를 얻을수 있는데, 위의 예문에서
 function()함수 콜을 어셈코드로 보면 다음과 같다. 

        pushl $3
        pushl $2
        pushl $1
        call function

 우선 3개의 인자를 스택에 넣고, 그 다음에 function을 호출하게 된다.
 call이라는 명령어가 호출됨과 동시에, 스택에는 IP가 스택에 쌓이게 된다.
 (호출함수가 끝나고 되돌아와야하는 다음 명령의 instruction pointer를 저장)
 그것을 RET (return address) 라고 한다.
 
 function 함수가 호출되면 가장처음 하게되는 동작은 다음 어셈이다.

        pushl %ebp - 원래 스택프래임 포인터를 저장
        movl %esp,%ebp -  ebp에 현재의 스택포인터를 저장
        subl $20,%esp - 스택공간을 생성

 어떠한 함수가 호출되더라도, 다음과 같은 과정을 거치며, 위 과정은
 호출된 함수에서 그 함수의 실행흐름을 위한 스택을 생성하고, 함수가 끝난뒤
 RET로 돌아갔을때, 함수가 호출되기전의 스택의 흐름을 그대로 유지하기 위한
 작업이다. 우리는 이 저장된 포인터를 SFP (Saved frame pointer) 라고 한다.   

 보통 우리가 사용하고 있는 아키텍쳐는 대부분 32bit일 것이다. 이는 Word단위가 
 4바이트=32bits 라는 것을 의미한다. 그래서 함수내부에어 선언된 buffer1의 경우 5바이트 이지만,
 아키텍쳐의 Word단위에 맞추어, 메모리상에 8바이트가 설정되게 된다. buffer2 역시도 10바이트 배열이지만,
 12바이트가 설정되게 되는것이다. 
 그래서 어셈코드에서 3번째줄인 스택공간 생성에 있어, 20을 SP에서 빼는 것이다.
 함수가 호출된뒤에 스택의 모양은 다음과 같다.


bottom of                                                            top of
memory                                                               memory
           buffer2       buffer1   sfp   ret   a     b     c
<------   [            ][        ][    ][    ][    ][    ][    ]
   
top of                                                            bottom of
stack                                                                 stack


                              

'RCE' 카테고리의 다른 글

Ollydbg plugin - OllyFlow / OllyGraph  (2) 2010.05.06
PEview Bug??  (0) 2009.08.26
ollydbg plugin - StrongODv0.2.3  (1) 2009.06.11
ida pro 5.2 bug  (0) 2009.05.19
data code 분석을 위한 ida의 사용법 & Sality.L  (0) 2009.04.27