Memory : stack(스택)
stack(이하 스택) 이란 무엇일까요? 스택은 함수 호출 시 지역변수와 매개 변수가 저장되는 영역 입니다. 만약 함수 호출이 완료가 되면 메모리에서 제거가 되는 특징을 가지고 있으며 컴파일 런 때 크기가 결정이 됩니다.
메모리 구조 글 보러가기.
이론적인것은 간단했다. 이제 예제를 통하여 메모리에서 스택이 쌓이는 것을 확인해보자.
간단한 소스를 작성해보겠습니다.
#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를 하니 스택창에는 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 |
Calling Conventions(콜링 컨벤션) (0) | 2015.05.18 |
레지스터 (0) | 2015.05.13 |
Handray (0) | 2015.03.25 |