카테고리 없음

2. x64 스택 관리

rmagur1203 2021. 5. 23. 01:52

1. 스택

스택은 지역변수나 매개변수를 저장하는 영역입니다.

높은 주소부터 시작해 낮은 주소로 점점 늘어납니다.

스택 영역이 점점 늘어나서 힙 영역을 침범하면 스택 오버플로우가 일어납니다.

 

스택 영역엔 스택 프레임이란게 존재하는데

이러한 식으로 함수를 호출할 때 마다 스택프레임이 쌓이고

함수가 종료되면 스택프레임이 사라집니다.

2. 디버거에서 테스트

위 세 함수 모두 시작 부분에

push rbp

mov rbp, rsp

명령어가 있다.

이것이 무슨 뜻이냐면 새로운 스택 프레임을 생성하는 코드이다.

단계적으로 실행시키면서 봐보자.

push rbp를 실행하기 전이다.

rbp의 값인 0x7fffffffe3d0가 rsp의 위치에 들어갔다!

rsp의 위치에 원래 rbp의 위치를 넣어주는 이유는

현재 스택 프레임이 종료되면 rbp를 원래 rbp 위치로 옮겨줘야 하기 때문이다.

mov rbp, rsp를 실행하니,

rsp의 위치에 rbp가 실제로 위치하게 되었다.

이것은 즉 rbp의 값이 rsp의 값과 같아졌다는 뜻이다.

그리고 sub rsp, 0x30을 해줘서 0x30만큼 rsp를 위로 올린다(rsp에서 0x30만큼 뺀다)는 뜻이다.

0x30만큼 위로 올라갔기 때문에 0x30만큼 스택의 크기가 늘었다.

이것이 스택프레임을 생성하는 과정이다.

 

함수가 종료될 때 leave 명령어가 실행되면 자동으로 스택프레임도 지워지게 된다.

728x90