My Study/System

Memory : stack(스택)


 stack(이하 스택) 이란 무엇일까요? 스택은 함수 호출 시 지역변수와 매개 변수가 저장되는 영역 입니다. 만약 함수 호출이 완료가 되면 메모리에서 제거가 되는 특징을 가지고 있으며 컴파일 런 때 크기가 결정이 됩니다.


 메모리 구조 글 보러가기.


 그러면 메모리에서 어떤식으로 들어가게 되며 어떤식으로 제거가 될까요? 스택은 push, pop 의 영향을 받고 위에서 아래로 자랍니다.  쌓인다고 해도 괜찮지만, 저는 웬지 스택이 자란다고 하고 싶습니다. 스택이 자란다라고 한다니 무슨말 일까요? 이것은 나중에 예제를 보면서 이해를 해보도록 하겠습니다. 이 push 와 pop은 메모리에 넣거나 빼기 때문에 ESP에 영향을 주게 됩니다. 이제 push와 pop에 대해서 알아보도록 하겠습니다. push 는 말 그대로 메모리에 스택을 넣기 때문에 ESP가 4를 뺄샘니다. pop을 하게 되면 스택에서 제거하기 때문에 4를 덧셈니다. 중요한 것은 push 한 값과 pop 한 값이 같아야합니다. 이것 또한 예제를 보면서 이해를 해보도록 합시다.

어셈블리어 글 보러가기


 이론적인것은 간단했다. 이제 예제를 통하여 메모리에서 스택이 쌓이는 것을 확인해보자.

 

 간단한 소스를 작성해보겠습니다.


#include<stdio.h>


int _stack_confirm(int num1, int num2, int num3)

{

int result;

printf("%d + %d = %d\n", num1,num2,num1 + num2);

result = (num1 + num2)*num3;

return result;

}


void main()

{

int x = 2, y = 2, z = 3;

printf("%d\n", _stack_confirm(x, y,z));

}



_stack_comfirm이란 함수에서 덧셈, 곱셉을 하여 반환해주는 아주 간단한 소스이다.


이것 예제를 올리디버거에 올려서 확인을 해봅시다.



 현재 ESP는 스택 창에는 ret 값을 가지고 있습니다. 어셈블리어 코드를 보면 push가 4번 있고 printf 함수를 콜합니다. 그 뒤에 다시 push를 2번 하고 printf를 다시 콜 한 뒤 지금까지 push 했던 것을 pop으로 다시 뺍니다.


이제 push 4를 해보겠습니다.



push 4를 하니 스택창에는 ESP가 4증가한 것을 확인할 수 있습니다. 계속 해서 진행해보겠습니다.



이제 나머지 push들은 어셈블리 코드를 제외하고 스택 창만 확인해보겠습니다. 



 위에서 말했던 스택이 자란다는 말. 이 사진들을 보면 쉽게 이해할 것이라고 믿습니다. 스택에 push 함으로서 ESP가 점점 아래로 가고 있습니다. 이것을 저는 스택을 자란다고 표현하였습니다. 

이제 ESP를 더함으로서 스텍에서 빼는 것을 보겠습니다.


 또한 push와 pop이 같아야한다는 말도 있었죠? 이것은 push를 총 6번 하였으니 ESP가 10진수로 24가 감소하였습니다. 이제 마지막에 pop을 해주는 대신 ESP에 16진수로 18(10진수로 24)을 더함으로서 ESP를 다시 원래 위치로 옮겼습니다.


지금까지 stack 에 대해서 알아 보았습니다. 




[최종 실행 결과]


'My Study > System' 카테고리의 다른 글

DLL Injection (2) - EAT 를 이용한 DLL Injection  (0) 2016.05.23
DLL Injection (1) - 간단 기본 개념  (0) 2016.05.23
Memory : stack(스택)  (0) 2015.06.26
Calling Conventions(콜링 컨벤션)  (0) 2015.05.18
레지스터  (0) 2015.05.13
Handray  (0) 2015.03.25

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.