2014. 1. 22. 16:01 :: 리버싱

안녕하세요.

Seek 입니다~

 

오늘은 스택에 대해서 공부하도록 하겠습니다.

스택은 컬 변수 저장, 함수 파라미터 전달, 복귀 주소 저장 등 다양한 용도로 사용됩니다. 디버깅을 할 때 스택 메모리를 확인하는 일이 많기 때문에 스택의 동작 원리를 잘 알아두면 디버깅 실력 향상에 크게 도움이 될것입니다.

 

 

1. 스택

 

   프로세서에서 스택 메모리의 역할은 다음 세가지입니다.

   

    1) 함수 내의 로컬 변수 임시 저장

    2) 함수 호출 시 파라미터 전달

    3) 복귀 주소(return address) 저장

 

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

 

2. 스택의 특징

 

   프로세스에서 스택 포인터(ESP)의 초기값은 Stack Bottom쪽(스택메모리의 바닥쪽)에 가깝습니다. PUSH 명령에 의해서 Stack에 값이 추가되면 바닥부터 메모리가 저장되므로 스택 포인터는 Stack Top을 향해 바닥에서 위쪽으로 움직이고, POP 명령에 의해 스택에서 값이 제거되면 다시 스택 포인터는 Stack Bottom을 향해 아래쪽(바닥쪽)으로 움직입니다. 즉, 높은 주소에서 낮은 주소 방향으로 스택이 자라납니다. 스택 메모리에서 바닥에서 위쪽으로 값이 저장되면서 윗 방향으로 스택이 자랍니다. 이러한 스택의 특성 때문에 '스택이 거꾸로 자란다.'라는 표현을 쓰기도합니다. 이렇게 표현하는 이유는 스택이라는 단어는 뭔가를 쌓는다는 뜻이기 때문에 쌓을수록 위로 올라오는 것이 더 직관적이기 때문입니다.

 

3. 스택 동작 예제

 

   실제로 스택이 어떤 식으로 동작하는지 이해를 돕기 위해 예제를 실습해보겠습니다.

 

위 그림은 초기상태의 스택입니다. 스택포인터(ESP) 값은 18FF8C입니다. 그아래 스택 창을 보면 ESP가 가리키는 주소와 그 값을 보여줍니다. 이제 왼쪽에 PUSH 100명령을 실행해보겠습니다.

 

 

위 사진은 PUSH 100을 실행 시킨 결과입니다. 스택포인터(ESP)를 보시면 18FF8C 에서 18FF88로 4바이트만큼 줄어들어서 값이 위로 올라가신것을 보실수 있습니다. 그리고 그 아래 스택 창을 보시면 18FF88에 100이 PUSH명령에 의해 저장되어 있는 것을 보실수 있습니다.

 

즉, 스택에 값을 집어 넣었더니 ESP가 위쪽 방향으로 이동한 것을 볼 수 있습니다. (ESP값이 4만큼 줄었습니다.) 다음에는 POP EAX를 실행해서 값을 다시 꺼내보도록 하겠습니다.

 

 

위 사진은 POP EAX 명령으로 다시 스택에서 값을 꺼낸 결과를 보여주는 사진입니다. 다시 ESP는 4바이트만큼 증가하여 18FF8C로 되었고, 그 아래 스택 창을 보시면 초기 상태와 같이 바꼈습니다.

 

즉, 스택에서 값을 꺼냈더니 ESP는 아래쪽 방향으로 이동하였습니다.

 

결과입니다.

"스택에 값을 입력(PUSH)하면 스택 포인터(ESP)는 감소(위로 이동)하고, 스택에서 값을 꺼내면(POP) 스택 포인터(ESP)는 증가(아래로 이동)합니다."

 

추가로 스택 포인터의 초기 값은 스택 메로리의 맨 아래쪽에 있음을 다시 알아두기 바랍니다.

 

 

 

 

 

오늘 공부한 간단한 예제는 스택에 값이 입/출력 될 때 스택포인터의 변화를 잘 보여주고 있습니다. 응용 프로그램의 디버깅을 위하여 스택과 스택포인터의 변화를 눈여겨 보시면서 공부하시길 바랍니다.

 

 

참고서적 : 리버싱 핵심 원리 / 저자 : 이승원

 

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

Red_Seek :: 스택 프레임  (0) 2014.01.29
[Red_Seek] abex' crackme #1 (크랙미 #1)  (0) 2014.01.23
[Red_Seek] IA-32 Register  (0) 2014.01.14
[Red_Seek] 엔디언 표기법  (0) 2014.01.09
[Red_Seek] 리버싱(Reversing) 이란?  (0) 2014.01.08
posted by Red_Seek