출처 : www.reversecore.com
Stack
프로세스에서 스택(stack) 메모리의 역할은 아래와 같다.
1. 함수 내의 로컬 변수 임시 저장
2. 함수 호출 시 파라미터 전달
3. 복귀 주소(return address)를 저장
위와 같은 역할을 수행하기에는 스택의 FILO(First In Last Out) 구조가 아주 유용하다.
※ 스택에 대해서 주의할 점!
1. 32/64bit 컴퓨팅 환경에서 스택 크기는 각각 32/64bit (4/8 byte)이다.
2. 스택은 아래로 자란다. (높은 주소에서 낮은 주소로)
- 스택에 값을 입력하면 (PUSH 명령) 스택 포인터는 4bytes 만큼 줄어든다.
- 스택에서 값을 가져오면 (POP 명령) 스택 포인터는 4bytes 만큼 늘어난다.
Stack Frame
Stack Frame이란 쉽게 말해서 EBP 레지스터를 사용하여
스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법을 말한다.
(알다시피 ESP 레지스터가 Stack Pointer로써 스택의 Top을 가리키고, EBP 레지스터는 Base Pointer 역할을 한다.)
ESP 레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 ESP 값을 기준으로 하면 프로그램을 만들기 힘들고, CPU가 정확한 위치를 참고할 때 어려움이 있다.
따라서 어떤 기준 시점(함수 시작)의 ESP 값을 EBP에 저장하고 이를 함수 내에서 유지해주면,
ESP 값이 아무리 변하더라도 EBP를 기준(Base)으로 안전하게 변수, 파라미터, 복귀 주소에 접근할 수 있다.
이것이 바로 EBP 레지스터의 Base Pointer로써의 역할이다.
Stack Frame을 이용해서 함수 호출을 관리하면,
아무리 함수 호출 depth가 깊어지고 복잡해져도 스택을 완벽하게 관리할 수 있다.
※ 최신 컴파일러는 최적화(Optimization) 옵션을 가지고 있어서 간단한 함수같은 경우에 Stack Frame을 생성하지 않을 수 있다.)
※ Stack에 복귀주소가 저장된다는 점이 보안 취약점으로 작용할 수 있다.
Buffer Overflow 기법을 사용하여 복귀주소가 저장된 스택 메모리를 의도적으로 다른 값으로 변경이 가능하다.
'정상을향해 > Program Analysis' 카테고리의 다른 글
PE File Format (3) (0) | 2013.11.10 |
---|---|
PE File Format (2) (0) | 2013.11.10 |
PE File Format (1) (0) | 2013.11.10 |
Calling Convention (0) | 2013.11.10 |
IA-32 Register (0) | 2013.11.10 |
[ASM] 어셈블러 : 범용 레지스터 (0) | 2011.05.16 |