본문으로 바로가기

ETC카테고리에 있던 포스팅이였는데 그냥 reversing쪽으로 옮긴다. 리버싱 요소이기도 하다고 생각한다.


[1] 메모리 구조 - Stack

위 그림은 메모리의 구조를 이해하는데 많은 도움이 된다. 우리는 이중에서 Stack 에 대해서 자세히 알아보도록 할것이다.

일단 스택은 LIFO ( Last in First out - 후입선출 ) 구조로 되어있다. 

이는 스택이 자라나서 커널부분을 건드리지못하게 하려는 의도로 알고있다.


=====스택=====

높은 메모리주소 

--RET--

--SFP--

:                            <- 여기가 스택 시작부분!

:

여러가지 변수

함수 등등...

:

:                          <- 여기가 스택 끝부분!

============

낮은 메모리주소 






[2] Stack Frame, 함수 프롤로그, 에필로그

Stack Frame이란, EBP와 ESP를 사용하여 스택을 효율적으로 정리하는것을 말한다.

EBP와 ESP대한 이해는 https://sunrinjuntae.tistory.com/24?category=704012 요기서!


스택프레임은 아래 그림으로 보자.


=====스택=====

높은 메모리주소 

--RET--                    <- 여기가 함수가 끝나고 마지막으로 도착하는 부분! ===== POP EIP, JMP EIP

--SFP--                   <- 스택프레임을 거치고, 함수가 돌아가야할 위치를 저장해둔 포인터이다.

:                            <- 여기가 스택 시작부분! =====

:                             함수 프롤로그 :  PUSH EBP / MOV EBP, ESP                함수 에필로그 : MOV ESP, EBP / POP EBP

:                            ↓  아래쪽으로 스택이 쭈우우욱 자라남..

여러가지 변수

함수 등등...

:                            

:                          <- 여기가 스택 끝부분! =====

============

낮은 메모리주소 


함수가 처음에 시작되면 스택에 PUSH EBP를해서 스택을 -4하고 스택에 EBP를 올려놓고 이를 기준점으로 삼고, ESP를 이용해서 값을 계속 조작하여 프로그램을 효율적을 사용하게 하는것을 스택프레임,

함수가 처음에 시작되면 스택을 할당해주는 PUSH EBP / MOV ESP EBP 과정을 함수 프롤로그,

함수가 마지막에 끝나고 LEAVE ( MOV ESP EBP로 ESP를 EBP로 할당시켜준후, POP EBP로스택을 정리함 ) 명령어로 스택을 마무리하고, RET ( POP EIP, JUM EIP ) 를 통해 다음 명령어로 이동하는것을 함수 에필로그라고 한다.


이렇게 스택영역에서는 다양한 기법들을 활용해 데이터를 최적하시키고, 효율적으로 처리한다.






[3] 메모리 구조 - Heap

메모리 구조에서 Heap은, 동적할당된 메모리를 처리하는 역활을 한다.

코딩중 반드시 malloc같은 함수로 메모리를 동적할당하는 경우가 있을수있는데, 그때 heap에 메모리가 저장되는것이다.

이와같이 heap은 사용자가 직접 동적으로 관리할수있고, "관리 해야만 하는" 메모리구조이다.

( 왜냐하면 취약점이 잘터진다. )

스택과는 반대방향으로 자란다.