난 정말 최고야 멋있어
x86 cdecl,stdcall stack frame 본문
함수 호출 직후 , 프롤로그 이전
esp - 14 : 지역 변수 |
esp - 10 : 지역 변수 |
esp - c : 지역 변수 |
esp - 8 : 지역 변수 |
esp - 4 : 지역 변수 |
esp : 리턴 어드레스 |
esp + 4 : 파라미터 |
esp + 8 : 파라미터 |
"esp - xx " 에는 스택에서 사용 할 녀석들(지역 변수, 다른 함수에 넘길 인자들...)
"esp + xx " caller 함수의 잔해들 + 그 전 함수에서 넘긴 인자들이 있음
cdecl 과 stdcall 의 가장 큰 차이점은 스택을 caller 에서 정리하는가 아니면 callee 에서 정리하는 가의 차이!
WINAPI 는 callee 에서 정리하는 stdcall을 기본 호출 규약으로 삼고 있다! => 호환성을 위해서...
주로 많이 쓰이는 스택 프레임 만드는 방법으로
push ebp
mov ebp, esp
...
...
...
mov esp, ebp
pop ebp
*BOF를 이용해서 리턴값을 변조시키려면 프롤로그 이전 ESP의 주소 ( 새로운 스택프레임의 [EBP+4] )를 덮어씌워야 한다!
**BOF 이해를 위한 함수 프롤로그 이후 스택프레임의 모습