ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스택 프레임(Stack Frame) 실습 - stackframe.exe
    IT/리버싱 핵심원리 2017. 11. 23. 17:57

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

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


    관련글

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

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

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


    실습

    '리버싱핵심원리' 에서 제공하는 stackframe.exe 파일을 예제로 실습을 진행하겠다.


    stackframe.exe 다운로드


    먼저, "StackFrame.exe" 파일이 어떠한 코드로 작성 되었는지 아래 그림을 통해 살펴보자.


    StackFrame.cpp 소스코드

     


    위의 코드를 간단히 살펴보면,


    1. 메인함수 시작

    2. a 변수에 1 저장, b 변수에 2 저장

    3. add() 함수 호출

    4. add() 함수의 a 파라미터에 1, b 파라미터에 2가 들어가 있음

    5. a의 값을 x 변수에 저장, b의 값을 y 변수에 저장

    6. x+y 값을 리턴, 리턴된 값이 printf() 함수의 %d에 들어갈 변수가 됨

    7. return 0; 을 통해 종료


    이 프로그램을 통해서 스택 프레임이 어떻게 동작하는지 확인해 보자.


    ​먼저 OllyDbg를 통해 위에서 다운로드 받은 stackframe.exe 파일을 연다.

    후에 401000 주소로 이동한다.

    아래 [그림 1] 은 소스코드 부분이다.


    [그림 1] 소스코드 부분


    코드를 구별하기 쉽게 하기위하여 약간의 주석을 달았다.


    먼저, 401020 주소를 보자.

    main() 함수의 시작 주소이다.

    함수의 시작과 함께 스택 프레임이 생성되는 것을 확인할 수 있다.


    [그림 2] main() 함수 스택 프레임 생성


    "PUSH EBP" 명령을 통해 EBP가 이전에 가지고 있던 값을 스택에 저장해 둔다. (아래 [그림 3] 참조)

    "MOVE EBP, ESP" 명령을 통해 현재 ESP 값을 EBP에 저장한다.

    main() 함수가 끝날 때까지는 EBP 값은 고정된다.


    [그림 3] "PUSH EBP" 명령 이후 스택 변화


    스택 프레임이 생성된 뒤 main() 함수의 작업들을 수행하면 스택에 값들이 쌓이게 되고 ESP 값은 거꾸로 크게 되지만 EBP의 값은 변화가 없는 것을 확인 할 수 있다.


    다음으로 main() 함수에서 add() 함수를 호출하게 되면 다시 add() 함수에 대한 스택 프레임을 생성하게 된다.


    [그림 4] add() 함수 스택 프레임 생성


    main() 함수와 마찬가지로 진행된다.


    add() 함수의 연산이 끝나고 값을 return 하기 전에 스택을 살펴보자.


    [그림 5] add() 함수 return 전 스택


    여기서 주목해야 할 주소는 0012FF60과 0012FF78 이다.

    add() 함수가 진행되는 도중에 EBP는 항상 0012FF60 주소를 가지고 있으며 이 주소는 main() 함수로 돌아가기 위한 주소이다.

    더 정확히 말하자면, main() 함수의 스택 프레임 베이스 포인터로 돌아가는 것이 맞는 것 같다.

    add() 함수가 종료되면 "MOV ESP ,EBP" 명령을 통해 스택을 정리하게 된다.

    다음으로 "POP EBP" 명령을 통해 0012FF60 주소에 있는 값을 EBP에 저장하게 된다. (여기서는 0012FF78) 


    ※ 정리 ※

    "EBP는 함수가 종료되었을 때 스택이 돌아가야 할 주소를 가지고 있다." 라고 생각하는 것이 좋을 것 같다.

    "ESP는 현재 스택의 위치를 가르치는 것이다."


    내용이 너무 두서없이 작성되었다. 위의 실습 파일을 통해 직접 스택이 변하는 것과 ESP, EBP의 변화를 보는 것이 이해하는데 최고의 방법이라고 생각한다.








    도움이 되었다면 아래

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

    댓글

Designed by Tistory.