리버싱 핵심원리 1부 5장 정리
Note
본 게시글의 내용은 리버싱 핵심원리를 보며 복습 겸 정리하였습니다.
책의 내용과 일부 상이할 수 있고, 이해를 돕기 위해 강좌 형식의 말투와 적절한(?) 예시를 추가하였습니다.
본 게시글에서 사용되는 소스 코드와 파일, 프로그램은 리버싱 핵심원리에서 제공하는 파일과 언급되는 것들을 기반으로 하며, 일부 상이할 수 있습니다.
스택
택(Stack)은 자료구조의 한 종류로, FILO(First In Last Out, 선입후출) 또는 LIFO(Last In First Out, 후입선출)의 규칙을 따르고 있습니다. 즉, 한 쪽 끝에서만 데이터의 삽입(push)과 제거(pop)가 이루어집니다. 가장 마지막에 삽입된 데이터가 가장 먼저 나갈 수 있는 방식입니다. 레고 블록을 생각하시면 이해하기 쉽습니다. (밑에서 빼는거 말고..)
용도
프로세스에서 스택 메모리의 용도는 다음과 같습니다.
- 함수 내의 로컬 변수 임시 저장
- 함수 호출 시 파라미터 전달
- 복귀 주소 저장
예시
스택 포인터의(ESP) 값이 12FF8C일 때 push 100
명령을 실행하면 스택 포인터의 값이 12FF88로 4바이트 줄어듭니다. 그리고 스택 포인터가 가르키는 주소 12FF88에는 push
명령에 의해 100이라는 값이 저장됩니다.
pop eax
명령을 실행하면 스택 포인터의 값이 12FF8C로 4바이트 증가합니다. 스택에서 데이터를 꺼낸(제거) 것이기 스택 포인터의 값이 4바이트 증가합니다. eax
레지스터에는 스택에서 가져온 100 이라는 값이 저장됩니다.