본문 바로가기

공부/리버싱

리버싱 공부 05

<리버싱 핵심 원리>로 공부하였다.

 

05 스택

5.1. 스택

스택의 역할

1. 함수 내의 로컬 변수 임시 저장

2. 함수 호출 시 파라미터 전달

3. 복귀 주소 저장

위 역할을 수행하기 위해 FILO 구조가 유용함.

 

5.1.1. 스택의 특징

스택

프로세스에서 스택 포인터의 초기값은 아래쪽에 가깝다. PUSH 명령에 의해서 Stack에 값이 추가되면 스택 포인터는 위쪽으로 움직이고 POP 명령에 의해 스택에서 값이 제거되면 스택 포인터는 아래쪽으로 움직인다. 그림상으로는 아래에서 윗 방향이지만 주소상으로는 큰 수에서 작은 수로, 즉, 높은 주소에서 낮은 주소 방향으로 스택이 자란다. 

 

5.1.2. 스택 동작 예제

https://github.com/reversecore/book/blob/master/%EC%8B%A4%EC%8A%B5%EC%98%88%EC%A0%9C/01_%EA%B8%B0%EC%B4%88_%EB%A6%AC%EB%B2%84%EC%8B%B1/05_Stack/bin/Stack.exe

초기 상태 스택

ESP는 18FF8C이고, 스택도 ESP가 가리키는 주소와 그 값을 보여준다. 

401000 주소의 PUSH 100 명령을 실행하면 아래와 같이 변한다.

PUSH 100 실행

ESP는 18FF88로 4바이트 줄어들었고, 스택 포인터가 가리키는 주소에 PUSH 명령에 의해 100이 저장되었다.

POP EAX 명령어 줄을 실행시키면 아래와 같이 변한다.

ESP는 4바이트 증가하여 다시 12FF8C로 되었고, 스택 상태는 초기와 같아졌다. (스택에서 값이 꺼내짐)

정리 : 스택에 값을 입력하면 ESP는 감소하고 해당 ESP에 값이 입력되고, 스택에서 값을 꺼내면 ESP는 증가한다.

또한 스택 포인터의 초기 값은 스택 메모리의 아래쪽에 있다. 

'공부 > 리버싱' 카테고리의 다른 글

리버싱 공부 07  (0) 2022.01.09
리버싱 공부 06  (0) 2022.01.09
리버싱 공부 04  (0) 2022.01.09
리버싱 공부 03  (0) 2022.01.09
리버싱 공부 02  (0) 2022.01.09