우선 함수의 프롤로그와 에필로그에 들어가기 전 스택프레임을 알아야한다.
스택프레임이란?
스택 세그먼트 내부의 단위를 스택 프레임(stack frame)이라고 한다. 이 스택프레임은 함수가 호출될 때 생성되고, 반환될 때 해제된다. 즉 그 함수만의 스택영역을 구분하기 위해 생성되는 공간을 말한다.
스택 프레임 영역을 할당하기 위해 함수 프롤로그(prologue)와 함수 에필로그(epilogue)가 수행된다.
함수 내에서 다른 함수 호출을 위해 필요한 일
- 돌아갈 위치를 스택에 push한다.
- 이전 함수의 스택 base addr를 스택에 push한다.
함수를 수행을 마치고 호출 위치로 돌아갈 준비를 위해 스택을 다시 복원한다.
- 함수를 종료한다.
- 스택 base pointer를 이전 함수의 스택 base addr로 재설정 해준다.
- 호출한 함수로 돌아간다.
함수 프롤로그(Prologue)
//callee의 프롤로그
push ebp
mov ebp, esp
- push ebp
- 되돌아갈 함수의 base pointer를 스택에 저장한다.
- mov ebp, esp
- 현재 함수의 스택 base를 설정해준다.
이 과정을 함수 프롤로그라고 한다.
그림으로 표현하면 다음과 같다. 1번의 과정으로 SFP가 스택에 push되고, 2번의 과정으로 EBP와 ESP가 같아진다. 이제 스택에 callee의 변수가 들어오게 되면 esp의 값이 -되어 callee의 스택 프레임이 커지게된다.
함수 에필로그(Epilogue)
함수의 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원하는 과정으로, 프롤로그와 반대 과정으로 이루어진다.
leave
ret
보통 에필로그는 위의 두 명령으로 이루어진다.
leave
mov esp, ebp
pop ebp
leave 내부의 과정이다. 이때 pop ebp
명령은 스택의 최상위(esp가 가리키는 곳)에서 4byte를 복사하여 ebp에 담고 esp의 값을 esp+4로 바꿔준다.
ret
pop eip // stack의 RET를 eip로 pop
jmp eip
ret 내부의 과정이다.
에필로그 전체 과정
mov esp, ebp
pop ebp
pop eip
jmp eip
1. mov esp, ebp
esp값에 ebp를 넣어준다. esp의 값에 ebp를 넣어줬기 때문에 ebp와 esp가 같아진다.
2. pop ebp
esp가 있는 곳에서 4byte만큼 복사하여 ebp에 넣는다. 그 후 esp = esp +4를 하여 esp를 조정한다.
3. pop eip
esp가 있는 곳에서 4byte만큼 복사하여 eip에 넣는다. 즉 eip에 callee(a,b)이후의 위치가 들어가게 된다.
4. jmp eip
eip, caller의 callee 호출 이후 위치로 이동하며 함수 에필로그 끝
'CS > system' 카테고리의 다른 글
[System][Dreamhack] wargame - ssp_001 스택 순서 (0) | 2022.08.24 |
---|---|
[System][Dreamhack] bypass canary (0) | 2022.08.10 |
[System][Dreamhack] 메모리 보호 기법 memory mitigation - Stack Canary (0) | 2022.08.09 |
[System][Dreamhack] stack buffer overflow - 스택 버퍼 오버플로우 (0) | 2022.05.11 |
[System] 레이스 컨디션(Race Condition) (0) | 2022.05.09 |