스택 프레임(Stack Frame)이란?
What's the stack frame?
스택 프레임(Stack Frame)이란 함수가 호출될 때, 그 함수만의 스택 영역을 구분하기 위하여 생기는 영역이다. 이 공간에는 함수와 관계되는 지역 변수, 매개변수가 저장되며, 함수 호출 시 할당되며 함수가 종료되면 소멸한다.
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역변수 등이 저장됩니다. 이렇게 스택영역에 차례대로 저장되는 함수의 호출 정보를 스택프레임(Stack Frame)이라고 합니다. 이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있습니다.
1. 함수 프롤로그(Prolog)
push rbp, mov rbp, rsp
push rbp를 이용하여 함수의 rbp를 스택에 저장합니다. 그리고 rsp를 rbp에 복사함으로써 rsp를 rbp주소로 설정합니다. rbp는 함수의 기준점으로 가타내므로, rbp를 기준으로 RET이나 argc, argv 함수의 지역변수 등의 위치를 쉽게 알 수 있다.
2. 함수 에필로그(Epilog)
함수 에필로그 자신의 함수가 끝나 다시 돌아갈 때 스택을 정리하는 과정입니다. 다시 원래 상태로 만드는 것 입니다.
옆에선 mov eax, 0x0 pop rbp , ret 를 사용하고 있는데 leave, ret 으로 이루어져 있을 수도 있다.
여기서 leave는 실제 명령어 mov esp, ebp pop ebp로 이루어져 있고,
ret또한 pop eip jmp eip로 이루어져 있다.
leave 명령어로 인해 rsp가 현재 함수의 rbp를 가리키게 되고, pop rbp를 통해 sfp에 저장되었던 함수의 rbp값으로 rbp가 설정된다.
ret 명령어로 인해 pop eip 명령이 수행되고 ret값이 eip로 설정된다. 그리고 jmp eip를 통해 설정된 ret주소로 점프하게 된다. 여기서 ret값은 함수를 호출한 명령어의 다음주소를 담고있다.
참고
'해킹 > 리버싱' 카테고리의 다른 글
[해킹] 전용 레지스터 (0) | 2022.01.13 |
---|---|
[리버싱] rev-basic-4~6 write up (0) | 2021.07.14 |
[리버싱] rev-basic-0~3 write up (0) | 2021.07.14 |
[해킹] 레지스터 (0) | 2021.07.10 |
[해킹] 리버싱 시작 (0) | 2021.07.10 |