리버싱/리버싱 입문

리버싱 입문 1장 3 스택과 스택 프레임

상세 2021. 3. 7. 20:42

1.스택

후입 선출 방식으로 동작하는 특별한 자료 구조 

 

POP 과 PUSH라는 동작을 지원하는데 PUSH는 데이터를 넣는 명령어 POP은 꺼내는 명령어이다.

그냥 이름만 봐도 알 수 있다

 

PUSH를 하면 스택의 주소는 4바이트만큼 감소하면서 데이터가 스택으로 들어간다.

POP을 하면 스택의 주소가 다시 4바이트만큼 증가하고 데이터가 꺼내진다.

(데이터를 넣어서 용량이 줄어들고 데이터를 꺼내서 용량이 다시 늘어난다고 이해하면 된다.)

 

앞 게시글에 서술했던 ESP(스택 마지막 주소를 가리키는 레지스터)레지스터에 스택의 위치가 저장되어 있다.

스택에 값을 집어넣거나 빼면 ESP 레지스터 값이 실행한 명령어대로 4바이트씩 증가 혹은 감소한다.

 

2. 스택 프레임

함수가 가지는 자신만의 스택 영역

함수 내부에서 사용하는 데이터(매개변수, 지역변수)가 저장됨

함수가 호출될때 스택 프레임이 생성되고 함수가 종료될때 소멸된다.

 

동작 과정

함수를 호출할 때 필요한 인자들을 스택에 집어넣기 -> 함수를 실행하기 전에 운영체제는 복귀 주소를 집어넣음

-> 스택 프레임이 시작되면 이전 루틴이 사용했던 EBP 레지스터 내용을 백업 ->백업된 위치의 스택 주소를 함수의 EBP에 다시 집어넣음

이렇게 된 EBP는 스택 프레임에서 데이터 참조를 위한 기준 주소인 프레임 포인터로 사용됨.

 

프레임 포인터를 사용하는 이유 : ESP 레지스터는 계소 변하니 변하지 않는 EBP를 사용해서 데이터에 접근함

 

이 책은 정말 쉽게 설명해 주는 책이지만 그래도 어렵긴 어렵다. 어렵다보기엔 좀 복잡하다