스택 프레임 

어떠한 함수가 호출되었을 때 그 함수가 가지는 공간 구조이다.

ex ) void main() {

printf("화이팅");

}

어셈블리로 순서를 나타내면

프로그램 시작 
main() push
printf() push
printf() pop
main() pop
프로그램 종료

main 함수에서 printf 함수를 호출하네요 
메모리 상에서 main함수로부터 어딘가에 존재하는 printf 함수를 찾아가야 하고 
printf 함수가 종료되면 printf함수가 호출되었던 위치인 main 함수로 다시 돌아가야 합니다 

위에 있는 main함수는 function 함수의 위치를 파악 할 수 있습니다.
function 함수의 위치는 컴파일 할 당시에 지정이 되기 때문이죠.

허나 function 함수는 자신이 돌아갈 (main 함수) 위치를 알 수 없습니다 .

고로 main함수에서 function 함수를 호출하기 직전에 현재 위치를 스택 영역에 저장을 해야합니다 . function 함수가 끝나면 스택 영역에 저장된 main함수로의 복귀 주소를 알아내어 다시 돌아올 수 있기 때문입니다 .

*ebp는 베이스 포인터라고 불리웁니다. 이는 스택 프레임이 시작된 위치의 주소값을 가리킵니다 

여기서 잠시 일반적인 프로그램의 스택의 시작을 봐보도록 하겠습니다!

push ebp
mov  ebp , esp

이 친구들의 뜻이 뭘까요 ? 바로 스택 프레임의 생성입니다.
함수가 실행이 될 때 그 이전의 ebp(sfp)를 스택에 push하고 현재의 esp를 ebp에 저장해라 (새로운 ebp) 생성 이라는 뜻입니다

만약 
void function(){
123
}
void main()
{
  function()
}

이러한 프로그램이 있다고 칩시다!
function() 부분의 스택을 보게된다면 맨 처음에
Push ebp 
Mov ebp, esp 를 하고 있을겁니다 .
여기서 Push ebp가 실행이 되면 그 이전 스택 프레임(main)의 ebp가 
function의 스택 프레임에 push가 됩니다 . 

즉 main의 주소가 function의 esp 에 들어가게 됩니다!
이제 두번째 명령인 Mov ebp ,esp를 실행함으로써 
function 의 ebp로 만들어주게 됩니다 
고로 function의 ebp에는 main의 ebp가 존재하게 됩니다

*또한 새로운 function 스택 프레임의 ebp를 기준으로 
ret는 ebp-4 매개인자는 ebp-8과 같이 들어가게 됩니다

고로! esp는 현재 데이터의 위치 이고 ebp는 돌아와야할 주소 값!(main) 이란 겁니다!

'시스템' 카테고리의 다른 글

cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22
/bin/sh의 의미  (0) 2016.05.22
dummy 크기 정확히 파악하기 - 출처 http://beist.org  (0) 2016.05.01

+ Recent posts