본문 바로가기
Reversing

함수, 배열 | 스택프레임

by 09337 2021. 10. 18.

1. 함수, 배열 실습 내용 정리

1-1. 함수

call PRINT → PRINT 함수로 이동

 

1-2. 덧셈 함수

call ADD→ ADD 함수로 이동

 

1-3.  작은 값 구하는 함수

call MIN→ MIN 함수로 이동

어셈블리 JL: Operand 1 < Operand 2 일 때 점프

MIN 함수) eax와 ebx 비교 후, eax가 더 작으면 LABEL_1로 점프. eax가 더 크다면 ebx 값을 ecx에 옮긴 후, LABEL_2로 점프.

최종적으로 ecx 값 출력

 

1-4.  함수 안의 함수

call ADD → ADD 함수로 이동 → PRINT 함수로 이동

함수가 호출될 때마다 스택에 쌓이고, 함수가 끝나면 스택이 비워지면서 또 다른 함수로 스택이 채워진다.

 

1-5.  배열

WORD: 2byte

DWORD: 4byte

QWORD: 8byte

byte → word로 형 변환을 했고, word는 2byte이기 대문에 배열에 그 사이즈만큼 곱해줬다.

 

2. 스택 프레임

: ESP가 아닌 EBP 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법

스택 프레임을 생성할 때, EBP가 베이스 포인터의 역할을 한다. PUSH 명령어로 EBP가 이전에 가지고 있던 값을 스택에 백업하고, MOV 명령어로 ESP값을 EBP로 옮긴다.

이 명령 이후부터는 EBP는 현재 ESP와 같은 값을 가지게 되고, 함수가 끝날 때까지 EBP 값이 고정된다.

그래서 스택에 저장된 함수 파라미터와 로컬 변수들은 EBP를 통해서 접근한다.

 

스택 프레임을 해제할 때는 MOV 명령어로 ESP의 원래 값을 복원시키고, POP명령어로 스택에 백업해두었던 EBP 값을 복원시킨다. 마지막으로 스택에 저장된 복귀 주소로 리턴하여 함수가 종료되는 구조다.

 

2-1.  push, pop 스택 프레임

mov rbp, rsp를 통해 rbp에 rsp 값을 넣어준다.

push를 할 때마다 스택이 하나씩 쌓이게 되고, pop을 통해 마지막에 쌓인 스택이 빠지게 된다.

push 1과 push 2를 진행하며 rsp 주소가 바뀐다. 해당 주소 값에 들어간 값을 확인해보면 1과 2가 들어가 있다.

 

push를 넣은 값을 마지막부터 하나씩 빼서 rax, rbx, rcx에 넣어준다.

 

후입 선출 구조를 갖기 때문에 마지막으로 들어간 것이 가장 먼저 빠져 rax, rbx, rcx 순서대로 들어가게 된다.

 

2-2.  sum 함수 스택 프레임

스택에 값이 쌓일 때마다, rsp 주소는 낮아지고 높은 주소에 먼저 들어간 값이 담겨있는 것을 확인할 수 있다.

 

rbp에 main함수의 rbp를 저장한다.

 

rax에는 rbp+16 값인 2, rbx에는 rbp+24 값인 1이 저장된다.

 

add rsp, 16은 사용한 스택을 초기화해준다.

pop rbx, pop rax(pop 2회)로 add 대신 사용할 수도 있다.

 

스택을 초기화시켜야 메모리 공간이 생겨서 다시 사용할 수 있다.

'Reversing' 카테고리의 다른 글

어셈블리, 레지스터 정리  (0) 2021.10.11

댓글