리버스
함수 호출 시 ESP, EBP 레지스터와 스택 프레임
pseong
2021. 12. 27. 02:56
32비트 컴퓨터 기준으로 설명합니다.
함수 호출 시 실행되는 어셈블리어 코드는 다음과 같다.
- push 세 번째 인자
- push 두 번째 인자
- push 첫 번째 인자
- call 함수 주소
- push ebp
- mov ebp, esp
- sub esp, 100h (100h는 지역변수 할당 크기, 상황에 따라 달라진다.
- 함수 종료 시
- mov esp, ebp
- pop ebp
아래 그림을 보면 ebp+8이 첫 번째 인자고, ebp+12가 두 번째 인자, ebp+16이 세 번째 인자이다.
이렇게 증가시키면서 인자 순서를 사용하기 위해 메모리가 감소하는 방향으로 자라나는 스택 메모리 특징 상 세 번째 인자, 두 번째 인자, 첫 번째 인자 이렇게 반대 순서로 스택에 푸시하게 된다.
인자 푸시가 전부 끝나면 함수를 콜 하고 이때 리턴 주소를 푸시하게 된다.
그다음 이전 스택 프레임의 ebp(스택 프레임 시작)을 푸시한다.
그다음 ebp를 현재 스택 프레임의 시작으로 바꿔준다.
그다음 esp를 지역변수를 전부 사용할 수 있는 크기만큼 스택 크기를 할당한다.
따라서 지역변수는 ebp-4, ebp-8, ebp-16 이렇게 사용할 수 있다.
이후 스택 프레임의 상태는 다음과 같다.
