Study/App

[App]레지스터 스택프레임

seomj 2022. 10. 7. 15:27

다시 리마인드겸 추가 포스팅ㅎㅎ

 

[Reversing]스택프레임/프롤로그&에필로그

함수호출 1.함수가 사용할 파라미터를 스택에 넣고 함수 시작지점으로 점프(함수 호출)한다. 2.함수 내에서 사용할 스택프레임을 설정한다. (프롤로그) 3.함수의 내용을 수행한다. 4.수행을 마치

seomj74.tistory.com


스택 프레임

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장

http://www.tcpschool.com/c/c_memory_stackframe

함수호출

1. 함수가 사용할 파라미터를 스택에 넣고 함수 시작지점으로 점프(함수 호출)한다.

2. 함수 내에서 사용할 스택프레임을 설정한다. (프롤로그)

3. 함수의 내용을 수행한다.

4. 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원한다(에필로그)

 

sp: stack pointer, 현재 스택 위치

bp: base pointer, 스택 상대주소 계산

 

 

EX)

해당 코드를 실행.

먼저 push만 진행한다.

 

스택 상대 주소인 rbp와 현재 스택 주소인 rsp의 값을 확인.

 

이를 토대로 값을 확인.

 

이번엔 pop을 실행한다.

12번째 줄인 pop rax를 실행하자 rax 값이 0x03이 되었고 rsp의 값이 0x60fe20에서 0x60fe28로 바뀌었다.

 

pop을 모두 실행하고 나니 rbx와 rcx에도 각각 2와 1의 값이 들어갔고

rsp는 rbp의 위치로 돌아왔다.

 

해당 과정을 그림으로 표현하면 다음과 같다.

push
pop

 

 

EX2)

SUM함수에서 push rbp를 실행하자 rsp의 주소가 0x60fe18로 바뀌었다.

 

즉, 위에서 말했던 프롤로그를 확인할 수 있다.

push rbp를 통해 초기값을 스택에 저장하며 함수를 시작하게 된다. 

 

해당 주소의 값을 확인해보면 rbp의 주소 값이 들어간 것을 확인할 수 있다.

 

그 다음 줄을 실행하자 rbp의 값에 rsp의 주소 값이 들어간 것을 확인할 수 있다.

이것 또한 프롤로그의 내용이라는 것을 알 수 있다.

 

 

EX3)

22번째 줄을 실행하니 [rbp+16]의 주소에 있는 값인 0x02가 rax에 지정된 것을 확인할 수 있다.

 

그 다음 줄을 실행하면 [rbp+24]의 주소에 있는 값인 0x01이 rbx에 지정되게 된다.

*[ ]는 어셈블리에서 주소가 가르키는 값을 의미한다.

 

 

EX4)

16번째 줄을 실행하기 전에는 rsp의 값이 0x60fe28이다.

 

실행을 하면 rsp가 pop을 2번 실행하게 되므로 0x60fe38의 값을 가지게 된다.

해당 과정을 통해 스택을 초기화 할 수 있다.

 

이를 그림으로 그려보면 아래와 같이 그려지지 않을까...?

이는 확실하지 않아 다음 수업을 듣고 내용을 보충하겠다..

add rsp, 16을 하기 전에는 rsp가 0x60fe28의 값을 가지고 있지만 해당 코드를 실행하며 0x60fe38의 값을 가지며 초기화가 진행된다.(맞나?)

 

 

다음 코드 실행

add rsp, 16 을 통해 rsp 값이 0x60fe18에서 0x60fe28로 변경되었다.

 

그리고 rbx와 rax를 순서대로 pop하여 출력하면 7과 5의 값이 나오게 된다.

 

이를 그림으로 그려보면 아래와 같이 그려지지 않을까...?

이는 확실하지 않아 다음 수업을 듣고 내용을 보충하겠다..

add rsp, 16을 하기 전에는 rsp가 0x60fe18의 값을 가지고 있지만 해당 코드를 실행하며 0x60fe28의 값을 가지며

pop을 통해 초기화가 진행된다.(맞나?)