본문 바로가기

리버싱 개인 공부/[리버싱핵심원리]

[리버싱핵심원리] 스택

스택이란 로컬 변수 저장, 함수 파라미터 전달, 복귀 주소 저장 등의 다양한 용도로 사용됩니다.

프로세스에서 스택 메모리의 역할

  1. 함수 내의 로컬 변수 임시 저장
  2. 함수 호출 시 파라미터 전달
  3. 복귀 주소 저장

스택의 특징

스택 포인터(ESP)의 초기 값은 Stack botton쪽에 가깝습니다. PUSH 명령을 하면 Stack에 값이 추가되면서 Stack Top(위쪽)으로 움직이고, POP 명령을 하면 Stack 값이 제거되면서 Stack bottom(아래쪽)으로 움직입니다.

Ollydbg 실습

(”리버싱 핵심원리” 저자의 블로그에서 stack.exe라는 파일을 받아서 ollydbg로 열어봤습니다.)

위 화면은 초기 상태의 스택입니다. 스택 포인터(ESP)의 값은 19FF74이고, 스택 창에서 19FF74가 가리키는 값은 771100C9 입니다.

F7(Step into)로 push100을 실행시켜보면 ESP값이 19FF74 → 19FF70 으로 4가 줄은 걸 볼 수 있습니다. ESP값 가리키는 주소를 스택창에서 보면 100이 저장되어있습니다. 스택에 값을 집어 넣었더니 ESP가 위쪽 방향으로 이동한 것을 볼 수 있습니다.(초기 스택 값이 한칸 밀림)

이어서 F7로 POP EAX를 실행시켜 보겠습니다.

POP EAX를 실행하고 ESP 값을 보면 다시 4 바이트가 늘어서 초기 ESP값 19FF74과 똑같아졌습니다.

즉, 스택에 값을 입력하면 스택 포인터(ESP)는 감소하고 스택에서 값을 꺼내면 스택포인터는 증가합니다.

PUSH : 스택에 데이터 값을 저장. 새로운 데이터를 스택의 맨 위에 추가.

POP : 스택의 값을 가져옴. 스택의 맨 위에 있는 데이터를 제거하고, 해당값을 레지스터 또는 다른 변수에 저장.