Heap 기초 (with C언어)

Hunjison·2024년 1월 18일

Pwnable

목록 보기
1/3

Heap에 대한 생기초를 공부하면서 정리한 것.

1. 힙 오브젝트

모든 프로세스는 Default Heap(기본 힙) 공간을 가지고 있으며, 크기는 1MB이다.
프로세스는 Default Heap을 사용하면서 크기를 증가시키면서 사용할 수 있다.

그런데 멀티 스레드 환경에서 Heap은 모든 스레드에서 접근 가능한 자원이기 때문에, 여러 개의 Heap을 가지고 플래그를 통해 Heap의 속성을 제어할 필요가 생겨났다. 아래 함수들은 Default Heap 이외의 힙 오브젝트들을 생성, 삭제하는 함수이다.

  • HANDLE HeapCreate(DWORD fdwOption, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
  • BOOL HeapDestroy(HANDLE hHeap);

HeapCreate 함수에서 반환되는 HANDLE은 Heap을 지칭하기 위해 필요하다. Default Heap의 HANDLE을 얻기 위해서는 아래 함수를 이용하면 된다.

  • HANDLE GetProcessHeap();

2. 메모리 할당 및 해제

메모리 할당/해제를 위해서는 아래 함수들을 이용한다.

  • HANDLE HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
    • hHeap: Heap의 handle.
    • dwFlags: 플래그(생략)
    • dwBytes: 할당 크기
  • BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
    • pvMem: HeapAlloc()에서 반환된 handle.
  • HANDLE HeapReAlloc(HANDLE hHeap, DWORD fdwFlags, LPVOID lpMem, SIZE_T dwBytes);
    • 이미 할당된 메모리의 크기를 변경하는 경우.

이외에도..

  • SIZE_T HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
    • 힙에서 할당된 메모리 블록의 크기를 반환
  • BOOL HeapValidate(HANLDE hHeap, DWORD dwFlags, LPCVOID lpMem)
    • 특정한 힙 메모리 블록의 상태 확인

참고로 C++에서 new(), delete() 함수를 이용할 때에도 Default Heap을 이용한다.

참고

profile
비전공자 출신 화이트햇 해커

0개의 댓글