본문 바로가기
Study/Reversing

[Reversing] Stack 구조와 Stack Frame

by Jamie Lim 2020. 9. 8.

스택(Stack)이란?

메모리 구조

 

 - 위 사진에서 가장 아래 쪽에 있는 영역이 스택 영역이다.

 - 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out, 후입선출) 형식의 자료 구조이다.

 - 프로그램이 자동으로 사용하는 임시 메모리 영역으로 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값 등의 임시 데이터를 저장하는데 사용된다.

 

1) 코드(텍스트) 영역

    - 실행할 프로그램의 소스 코드가 저장되어 있는 영역

    - 실행 파일을 구성하는 명령어(함수, 제어문, 상수 등)들이 저장된다

    - 저장된 명령어를 CPU에서 하나씩 가져가 처리한다

 

  2) 데이터 영역

    - 전역변수와 static 변수, 배열, 구조체 등이 할당되는 영역

    - 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 소멸하는 영역

    - 초기에 사용할 메모리를 확보

    - 초기화 된 데이터는 data영역에 저장

    - 초기화 되지 않은 데이터는 BSS(Block Stated Symbol)에 저장

    - BSS : 런타임 후에 메모리 영역이 확보됨 -> 효율적

 

  3) heap 영역

    - 프로그래머가 할당 / 해제하는 메모리 영역

    - 이 영역에 메모리 할당하는 것을 동적 할당이라고도 부름

    - 해제를 제대로 하지 않으면 메모리 누수 문제가 생긴다

    - stack 영역과 반대로 메모리의 낮은 주소(위쪽)에서 높은 주소(아래쪽)의 방향으로 할당됨

  

  4) stack 영역

    - 프로그램이 자동으로 사용하는 임시 메모리 영역

    - 함수 호출 시 생성되는 지역 변수와 매개 변수를 저장하고 함수 호출 완료 시 소멸

      * 스택 프레임 : 스택 영역에 저장되는 함수의 호출 정보

    - push 동작으로 데이터를 저장하고 pop 동작으로 데이터를 인출한다

    - 후입선출(LIFO) 방식 -> 가장 늦게 저장된 데이터가 가장 먼저 인출

    - heap 영역과 반대로 메모리의 높은 주소(아래쪽)에서 낮은 주소(위쪽)의 방향으로 할당됨




스택의 구조

스택의 구조

 

 - 스택에서 삽입 연산 : PUSH

 - 스택에서 삭제 연산 : POP

 

 - PUSH를 통해 가장 먼저 저장되는 데이터가 스택의 아래 쪽(높은 주소)부터 쌓이고, 다음 데이터가 그 위에(낮은 주소)에 쌓인다.

 

 - POP을 통해 데이터를 삭제할 때는 가장 위에(낮은 주소) 있는 데이터가 삭제되고, 아래에(높은 주소) 있는 다음 데이터가 삭제된다.

 

 

Stack Frame

 

 - 함수가 호출되었을 때 그 함수가 갖는 공간의 구조이다.

 

 - 함수가 동작을 종료하고 복귀 주소로 돌아갈 때 스택 프레임은 소멸된다.

 

 - 어떠한 절차 혹은 함수의 호출에 따라 스택 영역에 저장된 프로그램의 프레임들은 순차적으로 쌓이고, 후에 쌓인 순서와 반대로 꺼내진다.

 

 - ESP 레지스터는 스택 포인터의 역할을, EBP 레지스터는 베이스 포인터 역할을 수행한다.

   > 프로그램 안에서 값이 수시로 변경되어 스택에 저장되는 변수나 파라미터에 접근할 때 ESP 값을 기준으로 하면 프로그램을 만들기 어렵다. 그래서 EBP를 통해 함수 시작의 기준을 정해 유지하면 ESP 값이 아무리 바뀌어도 EBP 값을 기준으로 하기 때문에 함수의 변수, 파라미터, 복귀 주소 등에 안전하게 접근할 수 있게 된다.

 

 - ESP는 값이 추가될 때마다 이동해 항상 스택의 최상단을 가리키고 있다. 그리고 EBP는 항상 스택의 최하단 부분의 가리키고 있다. 코드로 보면 아래와 같다.

 

  PUSH ESP       // 스택에 새로운 데이터 PUSH


  MOV EBP, ESP   // 스택의 가장 최하단 부분의 주소 값을 EBP에 저장

 

 

< 이미지 출처 >
https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/
https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D  

http://www.tcpschool.com/c/c_memory_stackframe

 

댓글