스택 프레임
스택메모리는 함수의 지역변수, 파라미터, 리턴주소가 저장되는 메모리 공간이다.
함수가 호출될 때 마다 스택에 생성되는 영역(블록)을 스택 프레임 이라고 한다.
스택 프레임 형성 과정
1. Call function
- 함수에 사용될 매개변수와 return address를 스택에 push한다.
2. Prologue
- push rbp / mov rbp, rsp / sub rsp, ...
3. exec function
- 파라미터는 레지스터 또는 스택으로 전달
- 지역변수는 rbp기준 상대 주소로 접근
4. Epilogue
- mov rsp, rbp / pop rbp / pop rip / ret
함수 에필로그/프롤로그 글이랑 같이 보면 좋을 것 같다.
gdb를 통한 스택 프레임 확인
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
add(1,2);
return 0;
}
간단한 덧셈 함수를 gdb를 통해 확인해 보았다.
구성 함수들
add함수를 Call 한 순간이다. 이미 ret은 push된 상태이다.
Call add 이전에 레지스터로 파라미터를 전달하는게 보인다.
add 내부 스택 프레임에서는 프롤로그 과정과 rbp기준 offset으로 인자를 전달 받는것을 확인할 수 있다.
이후 내부에서 레지스터를 이용해 연산을 마치고 프롤로그 과정을 거친다.
'PWN > 개념' 카테고리의 다른 글
스택 카나리(Stack Canary) (0) | 2025.06.19 |
---|---|
스택 버퍼 오버플로우(Stack Buffer Overflow) 취약점 (0) | 2025.06.18 |
셸코드 shellcode의 개념과 orw, execve 셸코드 작성 (0) | 2025.05.19 |
함수 호출 규약(cdecl, stdcall, fastcall ...) (1) | 2025.05.19 |
함수 프롤로그, 에필로그(x86-64) (0) | 2025.05.19 |