ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스택(Stack) 이란 무엇인가?
    IT/리버싱 핵심원리 2017. 11. 23. 17:37

    공부를 시작하기에 앞서 본 글은 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.

    또한 공부하는 입장에서 정리를 목적으로 작성하였기때문에 틀린 정보가 있을수도 있다는 것을 알려드립니다.


    관련 글

    스택(Stack) 이란 무엇인가?

    스택 프레임(Stack Frame) 에 대해서 알아보자

    스택 프레임(Stack Frame) 실습 - stackframe.exe


    1. 스택

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

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

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

      - 복귀 주소(return address) 저장


     스택은 FILO(First In Last Out) 구조



    위 그림을 설명하자면,

     1. PUSH A 명령을 실행하여 빈 스택에 A가 들어간다.

     2. PUSH B 명령을 실행하여 스택에 B가 들어간다. 이때 A가 먼저 들어가 있었으므로 그 위에 쌓이게 된다.

     3. PUSH C 명령을 실행하여 스택에 C가 들어간다. 이때 A와 B가 먼저 들어가 쌓여있으므로 그 위에 쌓이게 된다.

     4. POP() 명령을 실행하여 스택에 제일 마지막에 들어왔던 C가 나오게 된다.


    위의 그림이 실제로 어떤 식으로 동작하는지 보기위해 OllyDbg를 이용해서 보도록 한다.



    명령을 실행시키기 전이다. 위 그림의 오른쪽 하단에 빨간 박스로 체크되어 있는 곳이 스택을 확인하는 부분이다. 이제 00401000 주소에 있는 'PUSH 41' 명령을 실행해 보겠다.



    실행 결과, 스택에 '41' 이라는 값이 들어간 것을 확인 할 수 있다.

    여기서 주목할 점은 스택 포인터(ESP) 값이 감소한 것이다.

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

    리버싱 핵심원리에서는 이를 보고 "스택은 거꾸로 자란다." 라는 표현을 사용한다.


    다음으로 0041002 주소에 있는 'PUSH 42' 명령을 실행해 보겠다.



    실행 결과, 스택에 '42' 라는 값이 들어간 것을 확인 할 수 있다.

    스택 포인터의 값은 줄어들었다.


    다음으로 00401004 주소에 있는 'PUSH 43' 명령을 실행해 보겠다.



    실행 결과, 스택에 '43' 이라는 값이 들어간 것을 확인 할 수 있다.

    스택 포인터의 값은 줄어들었다.

    이쯤되면 PUSH 명령을 했을 때 스택에 어떠한 변화가 일어나는지 감이 올 것이다.


    다음으로 0041006 주소에 있는 'POP EAX' 명령을 실행해 보겠다.



    실행 결과, 스택에 제일 위에 있던 값 '43' 이 빠져나와 사라진 것을 확인 할 수 있다.

    POP 명령어를 사용할 경우, 뒤에 적어주는 레지스터에 스택 제일 위에 있는 값을 저장하게 된다.

    그 결과, EAX 레지스터에는 스택에서 빠져나온 '43' 이라는 값이 저장된 것을 확인 할 수 있다.

    또한, 스택 포인터는 POP 명령을 통해서 증가하였다.


    스택에 대해서 이해를 하면 다음에 배울 스택 프레임에 대해서 이해하기 쉽다.

    다음 글에서 스택 프레임에 대해 다루도록 하겠다.








    도움이 되셨다면 아래

    공감 버튼 한번씩 눌러주세요.^^


    댓글

Designed by Tistory.