Heap Spray 공격을 공부하면서 VMMAP을 이용하여 Heap 영역에 NOP sled와 Shellcode가 들어가는 것을 

확인할 수 있었다. 하지만 Heap Spray로 증가된 영역은 Private 영역이었고 따로 Heap 영역도 존재하여서, 

Private영역에 내가 넣은 코드가 들어가고 heap 영역에는 들어가지 않는지 궁금하였다.


▲Heap Spray 공격 이후 증가된 Private 영역


먼저 어떻게 된 것인지 구글신에게 물어보니 함수를 기준으로 설명해 놓은 블로그들을 많이 보았다.

가장 큰 기준은 HeapAlloc VS etc 라는 것이다. etc에는 C에서 사용되는 malloc과 C++에서 사용되는 new를 

포함하여 LocalAlloc과 HeapAlloc도 포함된다.

이에 etc의 중 하나인 LocallAlloc를 기준으로 HeapAlloc과 비교하면서 VMMAP에 나오는 heap부분과 

Private data 부분에 대해 정리하였다.


힙 할당 함수

LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);

HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);

HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);


LocalAlloc과 GlobalAlloc을 같은 특성을 지녀 묶고, HeapAlloc과 구분지어 설명하도록 하겠다.

먼저 LocalAlloc부분은 항상 디폴트 힙에서 할당된다. 디폴트 힙이라 하면 하나의 어플리케이션이

하나씩 가지는 힙이다. 기본적으로 1MB로 할당되며 /Heap 옵션을 주어서 크기를 조절할 수 있다.

그렇다고 해서 1MB로 디폴트 힙을 할당해놓으면 1MB이상의 메모리 주소를 할당하지 못하는건 아니다.

윈도우가 알아서 필요하다면 늘려준다고 한다. 먼저 디폴트 힙 영역을 RESERVE 해놓은 이유는

미리 처리하여 시간을 줄이기 위해서라고 한다. 그 다음 HeapAlloc의 특성은 아래에 몰아서 설명하겠다.


리턴값을 기준으로 살펴보면 LocalAlloc핸들을 리턴하고 HeapAlloc포인터를 리턴한다.

그래서 LocalAlloc으로 할당받은 메모리 블록을 실제로 사용할 때는 LocalLock함수로 포인터를 얻어와야한다.

불편하지만 Lock이라는 단어에서 알 수 있듯이 동기화 기능을 제공한다. 하나의 프로세스 안에 있는 

멀티 스레드들이 같은 영역의 메모리를 할당하거나 해제하려 할 때 예외발생을 방지하려는 것이다. 

아래 그림에서 보듯이 LocalAlloc을 이용하여 디폴트 힙 영역을 할당할 때 단편화가 발생할 수 있는데, 

LocalAlloc의 첫번째 인자로 GMEM_MOVEABLE이라는 특성을 지정하여서

힙관리자가 메모리 블록을 이동 시킬 수 있다. 

이때 이동하여 생긴 잘못된 주소 참조를 할 수도 있으므로 핸들로 관리하는 것이다.


디폴트 힙 영역을 사용하면 무작위 메모리 할당 및 그에 따른 힙 크기의 증가 때문에

단편화(fragmentation)이 발생할 확률이 높다. 단편화가 많이 일어나면 로컬리티특성이 낮아서

성능이 떨어진다. 그래서 동적 힙영역을 사용하여 사용할 부분을 RESERVE하기 때문에 메모리 단편화가 

발생하지 않는다. 아래그림을 참고 하라.


▲동적 힙 영역(왼), 디폴트 힙 영역(오른)

로컬리티

템퍼럴 로컬리티

프로그램 실행 시 한번 접근이 이뤄진 주소의 메모리 영역은 자주 접근하게 된다는 특성

스페셜 로컬리티

프로그램 실행 시 접근하는 메모리 영역은 이미 접근이 이루어진 영역의 근처일 확률이 높다는 특성


HeapAlloc은 디폴트 힙 영역이 아니라 임의의 그러니까 동적 힙영역에 생성된다.  디폴트 힙 이외에 Windows

시스템에서 제공하는 함수호출을 통해 프로세스에 추가로 생성하는 힙을 private heap이라고 한다.

여기에 내가 원하던 답이 있었다. 결국에는 처음에 컴파일 시에 링킹 옵션을 통해 정하면서 생성되는 부분을 

디폴트 힙이며 그 부분이 VMMAP에 나오는 heap이고, Windows 시스템 함수에 의해 추가로 생성되는 힙을

Private Heap이라고 하는 것이다!!!

Process Defualt heap 이외에 Windows 시스템에서 제공하는 함수 호출(HeapCreate)을 통해서 

프로세스에 추가로 생성하는 힙을 Private Heap이라고 한단다.

이를 통해 위에서 말했는 것을 포함해 몇가지의 장점이 있다.

1.단편화 최소를 통한 성능향상

2.동기화 문제에서 자유로움

이러한 힙을 (생성과 소멸), (할당과 해제)에 각각의 함수들이 쓰인다.

(HeapCreate HeapDestroy), (HeapAlloc HeapFree)

여기서 인자들이 많이 들어가는데 힙의 기본 할당 사이즈를 맞춰주는 부분이나 동기화부분 같은 옵션들이

들어간다.


이렇게 VMMAP에서의 Heap 부분과 Private 부분을 통해서 Heap에 대해 알아봤다.

정리하자면

LocallAlloc, GlobalAlloc, malloc, new 등의 디폴트 힙에 생기며 단편화가 발생하고

HeapAlloc은 동적 힙영역에 생기며 단편화가 생기지 않지만 디폴트 힙처럼 미리 RESERVE를 해두는 것이 

아니므로 처리시간이 좀 걸린다고 생각하면 될 것 같다.




참조:

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7358

http://mlpworld.tistory.com/entry/힙-메모리-관련-API

http://christin2.tistory.com/entry/Chapter-20-메모리-관리Virtual-Memory-Heap-MMF

http://sweeper.egloos.com/viewer/1791208

뇌를 자극하는 윈도우즈 시스템 프로그래밍 - 윤성우





+ Recent posts