공부/리버싱핵심원리

5장 스택

리버싱 핵심원리.

로컬 변수 저장, 함수 파라미터 전달, 복귀 주소 저장등의 다양한 용도로 사용된다.

디버깅할 때 스택 메모리를 확인하는 일이 매우 많다고 한다. 스택의 원리를 잘 알아보자.

 

먼저, 프로세스에서 스택 메모리의 역할을 알아보자

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

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

3. 복귀 주소(return address) 저장

이런 역할을 수행하기 위해서는 First in Last Out 구조가 매우 유용하다.

 

스택 메모리의 구조

프로세스에서 ESP(스택 포인터)의 초기 값은 StakBottom이다.

PUSH 명령으로 스택에 값을 추가해 나가고, 스택 포인터는 Top을 향해 갈 것이다.

POP명령으로 스택이 값을 빼나가면, 스택 포인터는 bottom을 향해 갈 것이다.

 

위의 그림을 보면 알 수 있듯이 스택에 PUSH를 할 수록, 낮은 주소의 방향으로 다가간다.

그래서 스택은 거꾸로 자란다고 생각할 수도 있다.

 

디버깅을 통해 실습해보자.

 

Stack.exe EP

현재 ESP(스택포인터)의 값은 0019FF74이다. 그럼 스택창에서 해당 주소의 값을 확인할 수도 있다.

F7(Step Info)를 통해 401000주소의 PUSH 100을 실행해보자.

ESP가 0019FF70이 되었다. 이전의 ESP에 비해 4바이트 줄어들었다. 

또한 스택이 가리키는 0019FF70에는 숫자 100이 저장되었다.

 

다시 한 번 F7을 통해 401005주소의 POP EAX를 해보겠다.

ESP는 다시 4만큼 늘어났고, 이는 Stack Bottom을 향해감을 의미한다.

또한, EAX값이 100이 되었다.

 

따라서 스택에 값을 입력하면 ESP는 감소하고, 스택에서 값을 꺼내면 ESP는 증가한다고 생각할 수 있다.

 

 

 

 

이번 내용은 쉽다. 자료구조/알고리즘 공부할 때 배운 스택이 나와서 재미있었다.

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

6장 abex' crackme #1 - 책의 풀이  (0) 2020.12.01
6장 abex' crackme #1 - 나의 풀이  (0) 2020.11.30
4장 IA-32 Register  (0) 2020.11.30
3장 리틀 엔디언 표기법  (1) 2020.11.28
2장 Hello, World! 리버싱  (0) 2020.11.28