pseong

함수 호출 시 ESP, EBP 레지스터와 스택 프레임 본문

리버스

함수 호출 시 ESP, EBP 레지스터와 스택 프레임

pseong 2021. 12. 27. 02:56

32비트 컴퓨터 기준으로 설명합니다.

 

함수 호출 시 실행되는 어셈블리어 코드는 다음과 같다.

  1. push 세 번째 인자
  2. push 두 번째 인자
  3. push 첫 번째 인자
  4. call 함수 주소
  5. push ebp
  6. mov ebp, esp
  7. sub esp, 100h (100h는 지역변수 할당 크기, 상황에 따라 달라진다.
  8. 함수 종료 시
  9. mov esp, ebp
  10. pop ebp

아래 그림을 보면 ebp+8이 첫 번째 인자고, ebp+12가 두 번째 인자, ebp+16이 세 번째 인자이다.

이렇게 증가시키면서 인자 순서를 사용하기 위해 메모리가 감소하는 방향으로 자라나는 스택 메모리 특징 상 세 번째 인자, 두 번째 인자, 첫 번째 인자 이렇게 반대 순서로 스택에 푸시하게 된다.

인자 푸시가 전부 끝나면 함수를 콜 하고 이때 리턴 주소를 푸시하게 된다.

그다음 이전 스택 프레임의 ebp(스택 프레임 시작)을 푸시한다.

그다음 ebp를 현재 스택 프레임의 시작으로 바꿔준다.

그다음 esp를 지역변수를 전부 사용할 수 있는 크기만큼 스택 크기를 할당한다.

따라서 지역변수는 ebp-4, ebp-8, ebp-16 이렇게 사용할 수 있다.

 

이후 스택 프레임의 상태는 다음과 같다.

 

'리버스' 카테고리의 다른 글

함수 호출 규약  (0) 2021.12.27
레지스터의 역할  (0) 2021.12.27
Comments