[Reversing] 스택

 

리버스 엔지니어링


(1) 스택

 

1-1. 스택이란?

  • 함수 내의 로컬 변수 임시 저장
  • 함수 호출 시 파라미터 전달
  • 복귀 주소(return address) 저장

위와 같은 역할을 수행하기에는 스택의 LIFO(Last In First Out) 구조가 아주 유용하다.

 

 

1-1-1. 스택 특징

 

[그림 1] 스택

 

[그림 1]의 내용을 간단히 설명하자면, 다음과 같다.

 

  • 프로세스에서 스택 포인터(ESP)의 초기 값은 Stack Bottom쪽(그림 아래쪽)에 가까움
  • PUSH 명령에 의해서 Stack에 값이 추가되면 스택 포인터는 Stack Top을 향해 (위쪽으로) 움직임
  • POP 명령에 의해 스택에서 값이 제거되면 스택 포인터는 Stack Bottom을 향해 (아래쪽으로) 움직임
  • 즉 높은 주소에서 낮은 주소 방향으로 스택이 자라남

위 그림으로 보면 아래에서 윗 방향으로 스택이 자라난다.

 

이러한 스택의 특성 때문에 보통 "스택은 거꾸로 자란다."라는 표현을 쓰기도 한다.

 

이렇게 하는 이유는 스택이라는 단어는 뭔가를 쌓는다는 뜻이기 때문에 쌓을수록 올라오는 것이 직관적이기 때문이다.

 

 

1-1-2. 스택 특징 및 동작

  • 스택에 값을 입력하면 스택 포인터(ESP)는 감소하고, 스택에서 값을 꺼내면 스택 포인터는 증가
  • 스택 포인터의 초기 값은 스택 메모리의 아래 쪽에 위치
  • PUSH 명령일 경우, 스택에 값을 집어 넣어 ESP가 위쪽 방향으로 이동 (4바이트만큼 줄어듦)
  • POP 명령일 경우, 스택에서 값을 꺼내 ESP는 아래 방향으로 이동 (4바이트만큼 증가)

 

[그림 2] 스택 동작 원리

 

# 스택 추가 설명

  • 제한적으로 접근할 수 있는 나열 구조
  • 접근 방법은 언제나 목록 끝에서만 일어나며, 끝 먼저내기 목록이라고도 함
  • 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO)로 되어 있음
  • 자료를 넣는 것을 '밀어넣는다' 하여 PUSH라 함
  • 반대로 넣어둔 자료를 '꺼낸다' 하여 POP이라 함
  • 이때, 꺼내지는 자료는 가장 최근에 PUSH한 자료부터 나오게 되며, 나중에 넣은 값이 처음에 나오는 것을 LIFO라 함

# Reference

 

http://www.yes24.com/Product/Goods/7529742

 

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D

'Reversing' 카테고리의 다른 글

[Reversing] 함수 호출 규약  (0) 2020.03.26
[Reversing] Process Explorer  (0) 2020.03.26
[Reversing] IA-32 Register  (0) 2020.03.25
[Reversing] 리틀 엔디언 표기법  (0) 2020.03.24
[Reversing] OllyDbg 사용법  (0) 2020.03.24

+ Recent posts