완료됨
새로운 스택 프레임 생성

image.png
여기서 왜 rbp를 rsp로 옮기면 새로운 스택 프레임이 만들어지는 건지 궁금합니다.

작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
wyv3rn
무플 방지 위원회장

밑 질문에 답을 달았는데,

각 함수가 실행될때 해당 함수가 사용할 스택 공간을 확보하기 위한 초기 작업입니다.

예를 들어 메인 함수가 사용하던 스택 공간이 아래와 같다고 가정합시다.

0x8 <- rsp
0x9
0x10 <- rbp

이때 0x8과 9에는 메인 함수에서 사용하는 변수의 공간 입니다.

이때 win 함수가 메인 함수 내부에서 실행되면 스택 프레임은 새로운 공간을 할당하여 사용합니다.

왜냐하면 메인 함수에서 사용한 스택 프레임을 그대로 사용하면 win 함수에서 사용할 변수가 겹쳐져서 데이터 변조가 일어날 수 있기 때문입니다.

그래서
push rbp
mov rbp, rsp
sub rsp, 0x2
와 같은 명령어를 통해 새로운 공간을 새로 할당하는거지요.

이걸 다시 보면
push rbp

0x7 = 0x10 <- rsp
0x8
0x9
0x10 <- rbp

mov rbp, rsp

0x7 = 0x10 <- rsp, rbp
0x8
0x9
0x10

sub rsp, 0x2

0x5 <- rsp
0x6
0x7 = 0x10 <- rbp
0x8
0x9
0x10

가 됩니다.
즉 5와 6은 win 함수를 위한 공간이 되는거죠.

2023.08.24. 06:50
roronoa
대표 업적 없음

mov rsp, rbp하면 rsp가 rbp값을 가지니까 rbp와 rsp가같음, 그 후 스택을 사용함 함수가 끝날때 rbp값을 복원받고 ret함수로 호출한 넘 다음 주소로 감
[낮은주소]

-------------------------- <- rbp, rsp
rbp(rbp를 저장함으로써 호출된 함수가 끝났을 때 pop rbp하여 베이스 포인트 설정)

ret

argv

argc

env

[높은주소]

2023.08.24. 23:43