스택 (Stack)
프로세스에서 스택의 역할은 다음과 같다.
1. 함수 내의 로컬 변수 임시 저장
2. 함수 호출 시 파라미터 전달
3. 복귀 주소 저장
위와 같은 역할을 수행하기에 스택의 FILO(First In Last Out) 구조가 아주 유용하다.
스택의 특징
프로세스에서 스택 포인터(ESP)의 초기값은 Stack Bottom, 즉 스택의 가장 아래쪽에 가깝다. PUSH 명령에 의해서 스택에 값이 추가되면 스택 포인터는 Stack Top, 즉 스택의 위쪽으로 움직이고, POP 명령에 의해 스택에 값이 빠지면 스택 포인터는 Stack Bottom을 향해 움직인다. 즉, “스택은 거꾸로 자란다.”
실제로 스택이 어떻게 동작하는지 이해를 돕기 위해 OllyDbg를 이용해 간단한 예제를 살펴보자.
다음은 stack.exe를 OllyDbg에 로드한 초기 모습이다.
스택 포인터(ESP)의 값은 18FF8C이다. 스택 창을 보면 ESp가 가리키는 주소와 그 값을 보여준다.
Step Into로 PUSH 100 명령을 실행시키면 다음과 같은 결과를 볼 수 있다.
ESP의 값이 18FF88로 변해 4바이트만큼 줄어들었다. 즉, 명령을 실행했더니 ESP가 메모리의 상단으로 이동하고 있다는 것을 확인했다. 그리고 ESP가 가리키는 주소에 들어있는 값을 확인해보면 100이 저장되어 있는 것을 알 수 있다. 다시 한 번 Step Into를 실행해본다.
ESP의 값은 4바이트 증가하여 12FF8C로, 스택은 초기 상태와 똑같아졌다. 즉, 스택에서 값을 꺼냈더니 ESP는 아래 방향으로 이동했다.
이를 통해, ‘스택에 값을 입력하면 ESP(스택 포인터)는 감소하고, 스택에서 값을 꺼내면 ESP는 증가한다’를 확인할 수 있었다.
'Reversing > Etc' 카테고리의 다른 글
Data Recording & Register Basic (0) | 2017.06.26 |
---|