Reversing./Study

리버싱 - 기초 리버싱2

D2v 2017. 5. 4. 12:05

리버싱 - 기초 리버싱2


이번에는 스택에 관하여 자세하게 배워봤습니다.


1. 스택이란?


- 함수 내의 로컬 변수 임시 저장

- 함수 호출 시 파라미터 전달

- 복귀 주소(return address) 저장

- FILO 구조(First In Last Out)


※ FILO : 처음 들어온게 가장 마지막에 나갑니다.


2. 스택의 특징




위 사진을 보는거와 같이 스택 관련 명령어는 대표적으로 PUSH와 POP이 있습니다.


PUSH EAX로 스택에 넣으면 스택 포인터(ESP)가 위쪽으로 올라갑니다.(ESP가 가리키고 있는 주소는 감소)

POP EAX로 스택을 꺼내면 스택 포인터(ESP)가 아래쪽으로 내려갑니다.(ESP가 가리키고 있는 주소는 증가)


3. 함수와 스택의 관계


위 사진을 보면 MessageBoxA가 호출되는 부분입니다.

해당 API에서 요구하는 인자를 스택에 저장하고 API를 호출하고 있습니다.



스택을보면 먼저 스택에 넣은 PUSH 0 부터 스택에 되고있는것을 볼 수 있습니다.

CALL 부분을 F7로 트레이스 해보겠습니다.



위 사진과 같이 return address를 저장하는것을 볼 수 있습니다.

여기서 특정 함수에 진입시 스택에 리턴어드레스를 저장하는것을 알 수 있었습니다.


계속해서 확인해보겠습니다.



위 빨강 사각형을 보시면 새로운 함수가 시작되는것을 알 수 있습니다.

해당 함수는 stdcall 방식인것 같습니다.(함수 호출 규약에 대해서는 생략하겠습니다.)


stdcall 방식의 특징은 호출된 함수 내에서 기존 호출한 함수에서 넘어오면서 쌓인 스택이 정리되어 돌아가는 형태입니다.


RETN 10h 명령어를 보면 API를 호출하면서 총 16바이트의 스택을 사용했는데 이를 리턴 주소로 돌아가면서 정리하게 됩니다.