EBP
더 많은 작업
EBP(Extended Base Pointer, 베이스 포인터)는 32비트 x86 CPU의 범용 레지스터 가운데 하나로, 함수가 실행되는 동안 현재 스택 프레임의 기준 주소를 담아 인자와 지역 변수의 위치를 고정된 거리로 찾게 하는 프레임 포인터 레지스터이다.
x86 의 스택은 높은 주소에서 낮은 주소 쪽으로 자라고, 스택의 맨 위(가장 낮은 주소)는 ESP(스택 포인터)가 가리킨다. 함수 안에서 값을 push·pop 할 때마다 ESP 가 바뀌므로, ESP 를 기준으로 지역 변수를 찾으면 그 거리가 계속 달라진다. 그래서 컴파일러는 함수가 시작될 때 ESP 값을 EBP 에 복사해 두고, 함수가 끝날 때까지 EBP 를 고정된 기준점으로 쓴다. 이렇게 프레임 안의 한 곳을 가리키는 레지스터를 프레임 포인터(FP) 또는 지역 베이스 포인터(LB)라 하며, 인텔 계열에서는 EBP 가 그 역할을 맡는다.[1] x86 의 여덟 범용 레지스터는 대부분 특수 용도를 잃었지만, 관례상 ESP(스택 포인터)와 EBP(베이스 포인터) 둘은 그 용도로 남겨 둔다.[2]
함수 호출과 복귀는 다음 순서로 스택 프레임을 만들고 걷어 낸다.
; 호출하는 쪽 push 인자3 / push 인자2 / push 인자1 call func ; 복귀 주소(RET)를 스택에 넣고 func 로 점프 ; func 프롤로그 push ebp ; 호출한 함수의 EBP(저장된 프레임 포인터, SFP)를 보관 mov ebp, esp ; 지금의 스택 꼭대기를 새 기준점으로 sub esp, 12 ; 지역 변수 공간 확보 ; func 본문 mov eax, [ebp+8] ; 첫째 인자 mov [ebp-4], eax ; 첫째 지역 변수 ; func 에필로그 mov esp, ebp ; 지역 변수 공간 해제 pop ebp ; 호출한 함수의 EBP 복원 ret ; 스택의 복귀 주소를 EIP 로 꺼내 돌아감
프롤로그 뒤 프레임은 [EBP+8] 첫째 인자, [EBP+12] 둘째 인자, [EBP+4] 복귀 주소, [EBP] 저장된 이전 EBP, [EBP-4] 첫째 지역 변수 순으로 놓인다. 인자는 EBP 보다 높은 주소에, 지역 변수는 낮은 주소에 있어 함수 안 어디서든 같은 오프셋으로 찾을 수 있다. 복귀 값은 EAX 에 남겨 돌려준다.[2]
지역 배열은 EBP 아래(낮은 주소)에 놓이고, 배열에 값을 쓰면 주소가 높아지는 쪽으로 채워진다. 그래서 길이 검사 없이 큰 입력을 복사하면 배열 → 저장된 EBP(SFP) → 복귀 주소(RET) → 인자 순으로 덮어쓴다.[1]
- 공격자는 EBP 를 기준으로 버퍼에서 복귀 주소까지의 거리(버퍼 크기 + 저장된 EBP 4바이트)를 계산해, 복귀 주소 자리에 셸코드 주소를 넣는다
- 함수가 끝나
ret가 실행되면 덮어쓴 값이 EIP 로 들어가 공격자 코드로 흐름이 넘어간다 - 저장된 EBP 만 1바이트라도 바꿔 호출한 함수의 프레임을 가짜 위치로 옮기는 프레임 포인터 덮어쓰기 기법도 있다
- 스택 가드는 지역 변수와 저장된 EBP·복귀 주소 사이에 카나리 값을 두어 이런 덮어쓰기를 함수 복귀 전에 잡아낸다
| 레지스터 | 하는 일 | 스택 오버플로우에서의 의미 |
|---|---|---|
| EBP | 현재 스택 프레임의 기준 주소. 인자·지역 변수를 [EBP±n] 으로 참조 | 버퍼에서 복귀 주소까지의 거리를 정하는 기준. 저장된 EBP 자체도 덮어쓰기 대상 |
| ESP | 스택의 맨 위 주소. push·pop·call·ret 때마다 바뀐다 | 기준점이 계속 움직여 오프셋 계산의 기준으로 쓰지 않는다 |
| EIP | 다음에 실행할 명령의 주소 | 덮어쓴 복귀 주소가 결국 여기로 들어간다 |
| EAX | 누산기. 함수의 복귀 값을 담는다 | 스택 프레임 위치와 관계없다 |
| EDX | 데이터 레지스터. 곱셈·나눗셈에서 EAX 와 짝(EDX:EAX)을 이뤄 64비트 값을 담는다 | 스택 프레임 위치와 관계없다 |
- 64비트 x86-64 에서는 같은 역할을 RBP, RSP, RIP 가 한다. 최적화 컴파일에서는 프레임 포인터를 생략하고 RBP 를 범용으로 쓰기도 한다
- ↑ 1.0 1.1 Aleph One, 「Smashing The Stack For Fun And Profit」, Phrack 49호 14번 글, https://phrack.org/issues/49/smashing-the-stack-for-fun-and-profit, 확인일: 2026-11-04.
- ↑ 2.0 2.1 David Evans 외, 「x86 Assembly Guide」, University of Virginia CS216, https://www.cs.virginia.edu/~evans/cs216/guides/x86.html, 확인일: 2026-11-04.