본문 바로가기

Pwnable

Stack Frame 함수 프롤로그 & 에필로그

헷갈려서 정리해본다.

push rbp 를 하게 되면 rsp 가 -0x8 이 되고 메모리에 rbp 값이 들어간다.

pop rbp 를 하게 되면 rsp 메모리 값이 rbp 에 저장되고 rsp 가 +0x8 이 된다.

 

함수 프롤로그

얼마나 사용할껀지 정해놓고 시작한다. 아래는 초기값 이다.

tel $rbp

 

 

 

push rbp 한 결과다. ( rsp 가 -0x8 이 되고 메모리에 rbp 값이 들어간다 )

 

 

mov rbp, rsp 한 결과다.

 

 

 

sub rsp, 0x90 한 결과다.

 

 

 

main 함수 프롤로그는 0x90 만큼 스택을 확보하고 시작하는걸 알 수 있다.

 

함수 에필로그

leave 연산자는 mov rsp, rbp; pop rbp 를 수행한다. 아래는 초기값 이다.

 

 

 

leave 한 결과다.

step1. mov rsp, rbp

step2. pop rbp ( rsp 메모리 값이 rbp 에 저장되고 rsp 가 +0x8 이 된다 )

 

 

 

ret 한 결과다. (pop rip)

1. rip : 0x7ffff7c2a1ca (rsp : 0x7fffffffe2c8 → 0x7ffff7c2a1ca)

2. rsp : 0x7fffffffe2d0 (rsp : rsp(0x7fffffffe2c8) + 0x8)

 

 

결론

함수 프롤로그 전 rbp : 0x7fffffffe360

함수 에필로그 후 rbp : 0x7fffffffe360

서로 동일하다.