본문 바로가기

System Hacking

9일차] 스택 메모리, 함수

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