본문 바로가기

Security/Malware Analysis

[정리] 스택

안녕하세요. 

칸입니다.


오늘은 스택에 대해 정리해보도록 하겠습니다.


(2017.01.11)

0. 들어가기에 앞서....


매 정리 포스팅때마다 말씀드렸지만 저도 아직 배우는 입장이라 100% 맞는것은 아닙니다. [정리]가 붙어있는 글들은 제가 공부한 내용을 정리할 겸 올리는 글입니다. 참고해주세요. 또한 본문에 활용되는 대부분의 예제는 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.






1. 스택(Stack)



프로세스에서 스택메모리의 역할은 아래와 같습니다.


* 함수 내의 로컬 변수 임시저장

* 함수 호출 시 파라미터 전달

* 복귀 주소 저장


이 세가지 역할을 수행할 때 스택의 FILO(First In Last Out) 구조가 아주 유용합니다.


※ 스택의 FILO 구조 [그림4.1] 참고 : http://aaasssddd25.tistory.com/44?category=617818




1.1 스택의 특징



[그림 1.1] 


일반적으로 스택 메모리는 [그림 1.1]과 같습니다.

프로세스에서 스택 포인터(이하 ESP)의 초기 값은 Stack Bottom쪽에 가깝습니다. PUSH 명령에 의해 Stack에 값이 추가되면서 ESP는 Stack Top(위쪽)을 향해 움직이고 POP 명령에 의해 Stack에 값이 제거되면 ESP는 Stack Bottom(아래쪽)을 향해 움직입니다.


즉, 스택은 높은주소(아래쪽)에서 낮은주소(위쪽) 방향으로 스택이 자란다고 생각해볼수 있습니다.



1.2 스택은 어떻게 동작할까?




[그림 1.2]


[그림 1.2]는 우측에 보면 ESP(스택 메모리)값이 0012FFC4를 나타내고 밑에서는 0012FFC4가 가리키는 값인 7C817067이 나타나 있습니다.


그럼 F7(Step Into) 명령으로 PUSH 100 명령을 실행합니다.



[그림 1.3]


그 결과 ESP(스택 메모리) 값이 4바이트 줄어 0012FFC0이 되었습니다. 또한 ESP가 가리키는 주소(0012FFC0)에는 PUSH명령에 의해 100이 저장되어 있씁니다. 앞서 설명드린대로 스택이 쌓이면(PUSH) 스택 위쪽(Top)을 향해 움직입니다. 스택은 아래쪽(Bottom)이 높은 주소이므로 결국 ESP값이 감소하게 되는 것 입니다.


* PUSH 명령 -> 스택 탑으로 이동(높은주소 - > 낮은주소) -> ESP값 감소 


그후 또다시 F7을 눌러서 POP EAX를 실행합니다.



[그림1.4]


그 결과 ESP값이 [그림 1.3]과 반대로 4바이트 증가한것을 알 수 있습니다. 즉, 스택에서 값을 꺼내면(POP) ESP는 스택 아래방향으로 이동합니다. 


* 스택에 값을 입력하면(PUSH) 스택 포인터(ESP)는 감소하고, 스택에서 값을 꺼내면(POP) 스택 포인터(ESP)는 증가합니다.



[그림 1.5]






2. 마치면서...


다음번에는 스택 프레임에 대해 정리 해보도록 하겠습니다. 





'Security > Malware Analysis' 카테고리의 다른 글

[정리] IA-32 레지스터  (0) 2018.03.07
[정리] 리틀, 빅 엔디언  (0) 2018.03.07
[정리] 어셈블리어 정리  (0) 2018.03.07