1. 실행중인 프로세스의 전체 메모리 구조 알아보기.
스택 메모리 : 함수, 지역변수
1). sleep을 통해서 hello.c파일을 실행중인 파일로 만들어준다.
2). hello.c파일을 gcc 후에 실행하고 Ctrl+z를 통해 백그라운드를 시켜준다.
3). ps -ef | grep a.out을 통해서 PID를 알아낸다.
4) cd /proc/PID(836) 이때 PID는 다를 수 있다.
5) 해당 PID에서 cat maps파일을 보면 다음과 같이 스택메모리를 볼 수 있다.
6) 메모리 구조는 다음과 같이 할당되어 있다.
0x08048000-0x08049000 text section
0x08049000-0x0804a000 data section(.data .bss .heap)
~ deserved(heap) 예약됨. 힙영역
0x40013000-0x40014000 shared lib ld c언어 라이브러리
0x40014000-0x40016000 shared lib libc
~ deserved(stack) 예약됨. 스택영역
0xbfffe000(stack)-0xc0000000(0xbfffffff) stack, static , rwx , bottom
~ 0xffffffff kernel이 이용,,
#택메모리의 특징은 메모리가 할당될 때 아래쪽으로 할당이 된다. (계속 위쪽 방향으로 간다면 커널의 영역에 침범할 수 있기 때문)확인 가능하다. 예제를 보면서 스텍메모리를 확인 하는 것이 좀 더 이해하기 쉬울 것이다. 스텍은 쌓인다는 의미로 접시를 쌓는 것을 연상하면 된다.
2. 스택 메모리에 사용되는 레지스터
- ESP: Stack Pointer
- EBP: Base Pointer ( 기준점 )
int main()
{
int a;
int b;
a = 10;
b = 20;
...
}
스택 메모리에 데이터를 넣는 것을 push라 하고, 데이터를 꺼내는 것을 pop이라고 한다.
- SP: Stack Point
- ESP: 현재 스텍 메모리의 TOP을 가르키는 역할을 한다. (주소를 가리킴)
위 예제를 보면, esp의 스택메모리가 12씩 증가하고 있다. 증가할 수 록 메모리가 아래쪽으로 할당되는 것을 확인 할 수 있다. push를 하는 것은 스택메모리에 4바이트씩 할당되며, 따라서 12바이트씩, 스택이 증가함을 알 수 있다. 지금까지 실행파일을 실행할때마다 뜨는 Segmentation fault는 이러한 스택메모리를 정리를 안해주었기 때문이다. 다음 예제를 보자.
이는 스택메모리를 이용하면 10, 20, 30 을 출력하는 모습이다. 위의 예제의 과정을 살펴보면
(1) ebp를 스택메모리에 push해서 기준점을 만들어준다.
(2) ebp를 esp로 만들어주며, 이 부분을 프롤로그라고 한다. 다음에 나올 함수예제를 보면 좀 더 잘 이해할 수 있다.
(3) sub명령어를 통해 esp 12byte의 공간을 할당해 준다. ( 다시 얘기하지만 스택 메모리는 높은 곳에서 낮은 곳으로 할당이 된다. )
(4) ebp-4, ebp-8, ebp12, dword(4byte)에 각각 10씩 할당해 준다.
(5) push명령어 한번에 4byte 스택메모리가 사용되는데 add명령어를 통해 다시 8바이트씩 회수하는것을 볼 수 있다.
(6) 마지막은 leave, ret을 통해 스택 메모리를 정리하고있다.
leave 명령어는 mov esp, ebp + pop ebp 두 가지 뜻이 있는데,
처음에 push 했던 ebp를 pop하는 것을 볼 수 있다.
ret 명령어는 pop eip 라고 보면 되는데 메인함수를 호출하면서
저장된 ip를 pop을 pop함으로써 모든 스택 메모리를 정리한 것이다.
'System Hacking' 카테고리의 다른 글
8일차] 반복문(for, if) (0) | 2018.05.17 |
---|---|
7일차] 분기문(if, switch) (0) | 2018.05.16 |
6일차] 비트연산자, 논리연산, 형변환 (0) | 2018.05.16 |
5일차] 연산자 (사칙연산) (0) | 2018.05.15 |
4일차] 명령어(mov, lea) (0) | 2018.05.14 |