작은 메모장
가상주소공간의 스택 메모리 본문
스택공간이란?
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 레지스터를 다른 용도로 사용 가능하여 프로그램 성능 향상에 도움
컴파일러가 런타임에 사용되는 주소들을 미리 계산할 수 없어 컴파일에 큰 부담이 생김
스택 프레임 개념이 사라지므로, 분석 과정에서 디버깅이 매우 어려워짐
'KISA 사이버 보안 훈련 > 리버스 엔지니어링 훈련' 카테고리의 다른 글
함수 호출규약 (0) | 2023.07.05 |
---|---|
CPU의 레지스터와 주요 명령어 (0) | 2023.07.04 |
PE 파일의 구조 (0) | 2023.07.03 |
운영체제 프로세스 가상주소공간 실습 (0) | 2023.07.03 |
운영체제의 프로세스 가상주소공간 (0) | 2023.07.02 |