Basic of Computer Skills

스택 프레임(Stack Frame) 개요 본문

보안/Pwnable

스택 프레임(Stack Frame) 개요

cdecl 2018. 7. 31. 11:45

스택 프레임(Stack Frame)이란, 간단히 말해서 "함수 자신만의 공간" 이라고 말할 수 있다.


그리고 이는 LOB를 풀기 위한 배경지식이므로, 해당 개념을 모른다면 포너블을 할 수가 없다.


어찌보면 스택 프레임이 프로그램 메모리 구조의 가장 기본이되는 지식이기 때문이다.



다음과 같은 프로그램이 있다고 가정하자.





C 언어를 해봤다면, 프로그램이 시작할 때 main 함수부터 진행된다는 것쯤은 다 알 수 있을 것이다.


위의 프로그램은 main 함수가 func1을 호출하고, 또 func1은 func2를 호출하는 연쇄적인 구조를 가지고 있다.


따라서 해당 프로그램의 결과 값은



================

main has called

func1 has called

func2 has called

================


요렇게 나온다.


코드가 짧고 간결하니, 눈으로만 봐도 20초 안에 답을 찾을 수 있을 정도로 쉽다.


하지만 함수가 다른 함수를 호출하는 과정이 어떻게 진행되는지는, 저 코드만으론 정확하게 알 수가 없다.


유저가 직접 만든 저런 main이라든지, func1, func2와 같은 함수들은 프로그램이 실행되면서 스택이라는 메모리 공간에 쌓이게 된다.



프로그램이 시작하면 main 함수부터 시작하니, 초창기 스택에는 main 함수의 공간 정보가 들어갈 것이다.


다시 말하자면,  어떤 함수만이 갖는 자기 공간을 스택 프레임(Stack Frame)이라고 부른다.


현실로 치면 집 안의 자기 방 같은 개념임 


집을 스택이라고 가정하면, 그 안의 자기 방은 스택 프레임인 것이다. 즉, 스택 프레임은 스택의 부분 집합 개념이다. 



따라서 프로그램이 시작하자마자 main 함수가 시작되면 스택엔 즉시 main 함수만의 스택 프레임이 생성될 것이다.



그리고 이것저것 프로그램이 돌아가다 종료될 시기가 오면, 최종적으로 main 함수의 스택 프레임이 반납되면서 프로그램이 꺼지게 된다.


다시 위의 예제를 보자.


main 함수가 실행되는 와중에 printf 문을 뱉고나서 다시 func1 함수를 호출한다.


이때 스택 상황은 메인 함수의 스택 프레임 위에 func1 함수의 스택 프레임이 생성된다.




이렇게 된다.


이 상태에서 func1 함수가 func2 함수를 호출하면 func1 위에 또 func2의 스택 프레임이 생기는 것이다. (귀찮아서 안 그림)


 

그림으로 이해했다면 이제 코드로 넘어가야 한다.


점심때문에 이 부분은 다음 포스트에서 진행해야겠다. 

'보안 > Pwnable' 카테고리의 다른 글

스택 프레임 훑어보기 -2 (gdb 사용)  (1) 2018.08.02
스택 프레임 훑어보기 - 1 (gdb 사용)  (0) 2018.08.01
LOB 맛보기 (1번 예시)  (0) 2018.07.30
LOB 준비  (0) 2018.07.30
포너블(Pwnable) 개요  (1) 2018.07.30
Comments