스택(Stack)

스택은 제한적으로 데이터를 액세스 할 수 있으며, FILO(First in Last Out) 구조를 띄고 있다.

스택은 STACK의 탑 부분에서 데이터를 액세스 할 수 있다.

또한 데이터가 액세스 될때 스택의 주소 값은 점차 줄어든다.

(스택은 커널의 반대 방향으로 자라기 때문이다.)

 

프로세스에서 스택 메모리의 역할

1. 함수 내의 로컬 변수를 임시로 저장한다.

2. 함수를 호출 할 시에 파라미터를 전달한다.

3. 복귀 주소를 저장한다.

stack

 

PUSH와 POP을 이용해 데이터를 액세스 하며 제일 위에 있는 데이터를 우선적으로 뺀다.

 

스택포인터(SP)

중앙처리 장치 안에는 스택에 데이터가 채워지면 그 위치를 가리키는 레지스터인 스택 포인터(SP)가 있다.

STACK은 PUSH와 POP에 의해 액세스 되며 그에 따라 스택 포인터의 값이 증가하거나 감소한다.

 

스택 프레임(Stack Frame)

스택 프레임은  ESP(Stack Pointer)가 아닌 EBP(Base Poinet)를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법이다.

 

ESP는 프로그램 안에서 위치가 매번 변하기 때문에 기준점을 잡고 MOV EBP , ESP와 같이 어셈블리어를 사용하여 ESP 값이 EBP에 저장되게 한다.

스택 프레임의 구조

 

PUSH EBP;

PUSH EBP, ESP;

.

.

.

MOV ESP, EBP;

POP EBP;

RETN;

 

함수 시작(EBP를 사용하기 위해 기존 값을 스택에 저장)

현재의 ESP를 EBP에 저장

 

함수 본문 다른 것들이 실행 중

 

ESP를 정리(함수 시작했을 때의 값으로 돌림)

리턴되기 전에 원래 EBP 값으로 복원

함수 끝

 

간단한 코드를 예로 들어보겠다.

#include <stdio.h>

long add(long a, long b) {

 long x=a, y=b;

 return (x+y);

}

 

int main(int argc char* argv []) {

 long a=1, b=2;

 printf("% d\n", add(a, b));

 return 0;

시작하자마자 메인 함수는 스택 프레임을 생성시킨다.

1. long a, long b는 main 함수의 로컬 변수 이므로 스택에 공간을 만들고 값(1과 2)을 입력한다.

2. printf()함수를 스택에서 처리한다(역순으로 처리 하기 때문에 b, a, add()순으로 스택에 들어간다.).

3. add 함수를 호출하고 add함수 스택프레임에 x, y를 공간을 만들어 저장하고 값(x=a=1, y=b=2)을 입력한다.

4. 결과 값을 메인함수에게 돌려주고 printf() 처리 완료 및 add 함수 스택 프레임을 지운다.

5. main 함수를 처리한다.

 

main함수에서 add함수를 호출하고 add함수의 일련의 과정을 처리한 후 main함수 스택 프레임으로 돌아온다.

 

큰흐름은 5가지 단계이니 이를 참조하여 디버깅 툴을 사용해 직접 확인해보는것이 좋을 듯하다.

 

 

'Basic Concepts > System' 카테고리의 다른 글

SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22
BOF(Buffer Over Flow)  (0) 2020.04.22
RET Sled  (0) 2020.04.22
NOP Sled  (0) 2020.04.10
경쟁상태(race condition)  (0) 2020.02.25

+ Recent posts