본문 바로가기

리버싱

[리버싱]스택(Stack), 레지스터(Register), 스택 프레임(Stack Frame)

스택(Stack)

쌓다 라는 의미로 데이터를 차곡차곡 쌓아 올린 형태의 자료구조

제한적으로 접근할 수 있는 나열구조로 후입선출(LIFO)의 특징을 가지고 있습니다.

 

스택의 대표적인 사용 사례

  • 웹브라우저 방문기록(뒤로가기),
  • 실행취소(undo), 역순 문자열 만들기,
  • 후위 표기법 계산 

스택에 자료를 넣는 것을 push, 스택에서 데이터를 꺼내는 것을 pop이라고 합니다.

 

 

 

 

 

 

다음은 C언어를 사용하여 스택을 구현해 보았습니다.

 

 

#include<stdio.h>
#define MAX_STACK_SIZE 10

int stack[MAX_STACK_SIZE];
int top = -1;

int isFull() {
	if (top >= MAX_STACK_SIZE) {
		printf("스택이 가득 찼습니다.");
		return 1;
	}
	else
		return 0;
}

int isEmpty() {
	if (top == -1) {
		printf("스택이 비었습니다.");
		return 1;
	}
	else
		return 0;
}

void push(int data) {
	if (!isFull()) 
		stack[++top] = data;

}

int pop() {
	if (!isEmpty())
		return stack[top--];
	
}

int peek() {
	if (!isEmpty())
		return stack[top];
	else {
		printf("스택이 비었습니다.");
		return 0;
	}
}

int main(void)
{
	push(4);
	push(12);
	push(7);
	push(26);
	push(38);

	for (int i = 0; i <= top ; i++)
		printf("%d  ", stack[i]);

	pop();
	pop();

	printf("\n\n");
	for (int i = 0; i <= top ; i++)
		printf("%d  ", stack[i]);

	printf("\n\n%d", peek());

	return 0;

}

 

 

isFull, isEmpty로 스택이 비었는지 꽉 찼는지를 확인해 줍니다.

 

push로 데이터를 스택에 넣어주고, pop으로 데이터를 꺼냅니다.

peek로는 현재 제일 위에 있는 데이터를 확인 할 수 있습니다.

 

 

 

위와 같이 차례대로 4,12,7,26,38을 push를 통해 스택에 넣고, pop을 두 번 실행 시켰을때

위에 있던 데이터인 38과 26이 빠져나간 것을 확인할 수 있습니다.

그렇게 되면 맨 위에 있는 데이터가 7이 되고

peek를 통해 확인해 봤을때 7이 맨 위 데이터 인것을 확인할 수 있습니다.

 

 

 

 

 

 

레지스터(Register)

CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치

 

메모리로 연산의 결과를 보내고 영구적으로 저장할 데이터를 하드디스크에 저장해야 하는 등의 명령을 처리하기 위해서는 이들에 대한 주소와 명령의 종류를 저장할 수 있는 기억공간이 하나 더 필요한데 이러한 역할을 하는 것이 바로 레지스터입니다. 레지스터는 무리 없이 명령을 수행해야 하기 때문에 메모리보다 빨라야 합니다.

 

C언어에서의 레지스터 변수는 CPU 레지스터에 저장되는 지역변수로, CPU의 레지스터를 이용하여 처리 속도를 향상시키는 기능을 가지고 있습니다. 변수 선언 시 변수명 앞에 ‘register’ 키워드를 붙여주면 됩니다.

 

레지스터 변수 사용시 주의점

  • 레지스터 변수는 주로 반복문이나 인덱스와 같은 작은 범위의 변수에 사용되며 주로 지역 변수로 사용됨.
  • 함수의 매개변수, 전역변수는 레지스터 변수로 사용할 수❌
  • 레지스터 변수는 주소가 없기 때문에 포인터 변수가 될 수❌

 

 

 

 

 

 

 

 

스택 프레임(Stack Frame)

함수 호출시 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장되는데 이처럼 스택 영역에 차례대로 저장되는 함수의 호출 정보

 

스택 프레임의 역할

함수의 호출이 모두 끝난 후, 해당 함수가 호출되기 이전 상태로 돌아갈 수 있습니다. 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸하게 됩니다.

 

EBP(Extended Base Pointer) : 현재 스택 프레임의 첫 주소

ESP(Extended Stack Pointer) : 현재 스택이 어디까지 채워져 있는지 보여주는 함수

'리버싱' 카테고리의 다른 글

[리버싱] Exercise: rev-basic-0  (0) 2024.02.29
[리버싱] IDA 사용해보기  (1) 2024.02.21
[리버싱] PEViewer로 메모장 분석하기  (1) 2024.02.18
[리버싱]X86 Assembly  (1) 2024.02.17
[리버싱] Binary & Analysis  (0) 2024.01.28