작은 메모장

가상주소공간의 스택 메모리 본문

KISA 사이버 보안 훈련/리버스 엔지니어링 훈련

가상주소공간의 스택 메모리

으앙내눈 2023. 7. 4. 23:42

스택공간이란?

Stack discipline에 따라 관리되는 메모리 영역

데이터 섹션과는 다르게 실행 파일에 포함되어 있지 않으며, 쓰레드가 생성되면 동적으로 생성됨

 

스택의 용도

- 기본적으로 Reentrancy를 지원하기 위함

 

Reentrancy?

이미 호출되어 실행중인 어떤 함수가 리턴하기 전에 다시 호출될 수 있을 때, 그 함수를 Reentrancy가 가능하다고 표현

재귀함수나, 멀티쓰레드 환경에서 여러 쓰레드에 의해 동시에 호출되는 함수 등이 이에 속함

 

- 실행중인 각각의 함수는 전달될 파라미터, 지역변수, 리턴할 주소 등이 전부 다름

  때문에, Reentrancy를 지원하기 위해서는 동시에 실행중인 함수 각각의 상태에 관련된 정보를 별도로 저장해야 함

- 즉, 스택에는 Reentrancy가 일어나는 함수의 상태 정보(파라미터, 지역변수, 리턴주소)와 함수 실행 과정 중 임시로 백업    되는 데이터가 있음

 

Full Stack, Descending Stack

ESP 레지스터는 항상 스택의 마지막 데이터를 가리키는 주소를 저장함, 이를 Full Stack이라 칭함

Descending Stack은 높은 주소에서 낮은 주소로 스택이 쌓임을 의미함

반대로 낮은 주소에서 높은 주소로 스택이 쌓이면 Ascending Stack이라 부름

 

PUSH, POP

PUSH는 스택의 top에 데이터를 저장

PUSH 요청이 들어올 때마다, ESP 주소에서 스택 프레임을 하나씩 뺌

POP은 스택의 top에서 데이터를 꺼냄

POP 요청이 들어올 때마다, ESP 주소에서 스택 프레임을 하나씩 더함

 

 

스택 프레임

데이터가 아닌, 함수가 사용하는 스택 영역

EBP(Base Pointer)는 현재 실행중인 함수의 스택 프레임 시작주소

ESP(Stack Pointer)는 현재 실행중인 함수의 스택 프레임 끝 주소

함수가 실행할 때마다, EBP와 ESP는 계속 변함

 

스택 프레임의 생성 및 소멸

스택 프레임은 함수가 실행된 직후, 함수에 의해 생성

함수 시작 직후 스택 프레임을 오픈하는 코드를 함수 프롤로그라 부름

.text:0040101E		_main	proc near

.text:0040101E		push		ebp
.text:0040101F		mov		ebp, esp
.text:00401021		sub		esp, n

					(...)

.text:00401027		call		_myfunc
---------------------------------------
.text:00401000		_myfunc	proc near
.text:00401000		push		ebp
.text:00401000		mov		ebp, esp

반대로, 스택 프레임은 함수가 종료되기 직전, 함수에 의해 소멸

함수 종료 직전 스택 프레임을 클로징하는 코드를 함수 에필로그라 부름

.text:00401000		_myfunc	proc near
.text:00401000		push		ebp
.text:00401001		mov		ebp, esp
.text:00401003		push		ecx

					(...)

.text:00401020		mov		ebp, esp
.text:00401025		add		esp, 14h
.text:00401028		mov		esp, ebp
.text:0040102A		pop		ebp
.text:0040102B		retn
.text:0040102B		_myfunc	endp

 

Stack Frame Pointer Omission

EBP 레지스터를 스택의 프레임 포인터로 사용하지 않게 하는 컴파일 방식

스택 프레임을 설정 및 해제하는 코드가 없음

EBP 레지스터를 다른 용도로 사용 가능하여 프로그램 성능 향상에 도움

 

컴파일러가 런타임에 사용되는 주소들을 미리 계산할 수 없어 컴파일에 큰 부담이 생김

스택 프레임 개념이 사라지므로, 분석 과정에서 디버깅이 매우 어려워짐