728x90
반응형
sample.c
#include <stdio.h>
int myfunc(int a, int b)
{
char buf[10] = "abcd";
return a + b;
}
int main(int argc, char *argv[]) //caller
{
int c = 10;
c = myfunc(1, 2); //callee
return 0;
}
- 함수 호출 후에는 call 명령어가 오고, call (myfunc함수에 해당하는 이름)이 저장되어 있음 à push eip
- main 함수의 myfunc() 호출 후 다음 문장은 return 0; 이므로, EIP값이 자동으로 return 0;을 하게끔 바뀌므로, 해당 값을 myfunc() 프레임의 RET공간에 저장함
- RET에 저장 후 jmp를 수행하면 함수 프롤로그가 실행되고, push ebp를 해서 SFP가 생성된다.
- 그 다음 buf 공간이 생성되어 만들어진다.
- 함수 실행이 끝난 후 myfunc의 공간이 소멸되면 RET에 저장된 값 return 0;을 실행하게 된다.
**ESP의 값을 변경한다는 것은 사용하는 스택의 공간을 바꾸겠다는 뜻
ESP에 있는 수십개의 변수들을 없애는 방법은 현재 사용중인 Stack Point을 기준위치로만 바꾸면 됨
3EBP -> 2EBP -> 1EBP 순서까지 가면 myfunc의 2ESP가 남음
728x90
반응형