취약점 분석/힙(Heap)

힙의 세부 항목 조회

nightohl 2019. 3. 12. 20:17
반응형

힙의 세부 항목 조회


힙 주소를 얻었으면 조회를 해봐야지.

명령어 : dt _HEAP <힙주소>


0:000> dt _heap 00500000

ntdll!_HEAP

   +0x000 Entry            : _HEAP_ENTRY

   +0x008 SegmentSignature : 0xffeeffee

   +0x00c SegmentFlags     : 0

   +0x010 SegmentListEntry : _LIST_ENTRY [ 0x5000a8 - 0x5000a8 ]

   +0x018 Heap             : 0x00500000 _HEAP

   +0x01c BaseAddress      : 0x00500000 Void

   +0x020 NumberOfPages    : 0x100

   +0x024 FirstEntry       : 0x00500588 _HEAP_ENTRY

   +0x028 LastValidEntry   : 0x00600000 _HEAP_ENTRY

   +0x02c NumberOfUnCommittedPages : 0xf4

   +0x030 NumberOfUnCommittedRanges : 1

   +0x034 SegmentAllocatorBackTraceIndex : 0

   +0x036 Reserved         : 0

   +0x038 UCRSegmentList   : _LIST_ENTRY [ 0x50bff0 - 0x50bff0 ]

   +0x040 Flags            : 0x40000062

   +0x044 ForceFlags       : 0x40000060

   +0x048 CompatibilityFlags : 0

   +0x04c EncodeFlagMask   : 0x100000

   +0x050 Encoding         : _HEAP_ENTRY

   +0x058 PointerKey       : 0x3a46fa0f

   +0x05c Interceptor      : 0

   +0x060 VirtualMemoryThreshold : 0xfe00

   +0x064 Signature        : 0xeeffeeff

   +0x068 SegmentReserve   : 0x100000

   +0x06c SegmentCommit    : 0x2000

   +0x070 DeCommitFreeBlockThreshold : 0x200

   +0x074 DeCommitTotalFreeThreshold : 0x2000

   +0x078 TotalFreeSize    : 0x225

   +0x07c MaximumAllocationSize : 0x7ffdefff

   +0x080 ProcessHeapsListIndex : 1

   +0x082 HeaderValidateLength : 0x138

   +0x084 HeaderValidateCopy : (null) 

   +0x088 NextAvailableTagIndex : 0

   +0x08a MaximumTagIndex  : 0

   +0x08c TagEntries       : (null) 

   +0x090 UCRList          : _LIST_ENTRY [ 0x50bfe8 - 0x50bfe8 ]

   +0x098 AlignRound       : 0x17

   +0x09c AlignMask        : 0xfffffff8

   +0x0a0 VirtualAllocdBlocks : _LIST_ENTRY [ 0x5000a0 - 0x5000a0 ]

   +0x0a8 SegmentList      : _LIST_ENTRY [ 0x500010 - 0x500010 ]

   +0x0b0 AllocatorBackTraceIndex : 0

   +0x0b4 NonDedicatedListLength : 0

   +0x0b8 BlocksIndex      : 0x00500150 Void

   +0x0bc UCRIndex         : 0x00500590 Void

   +0x0c0 PseudoTagEntries : (null) 

   +0x0c4 FreeLists        : _LIST_ENTRY [ 0x504210 - 0x50b1c8 ]

   +0x0cc LockVariable     : 0x00500138 _HEAP_LOCK

   +0x0d0 CommitRoutine    : 0x3a46fa0f     long  +3a46fa0f

   +0x0d4 FrontEndHeap     : (null) 

   +0x0d8 FrontHeapLockCount : 0

   +0x0da FrontEndHeapType : 0 ''

   +0x0dc Counters         : _HEAP_COUNTERS

   +0x130 TuningParameters : _HEAP_TUNING_PARAMETERS


몇가지 중요한 요소만 짚고 가자.

+0x0a0 VirtualAllocdBlocks : _LIST_ENTRY
: 임계치보다 큰 할당은 세그먼트와 프리 리스트의 일부분을 고려하지 않고, 가상 메모리 관리자로부터 직접 할당 받는다. 이렇게 할당된 주소들을 링크드 리스트 형식으로 주소를 관리헌다.


+0x060 VirtualMemoryThreshold

: 가상 메모리 임계점을 메모리 블럭 단위로 명시. (*8 해야 bytes단위로 나옴.) 


+0x0a8 SegmentList

: 힙 세그먼트 리스트가 _LIST_ENTRY 로 연결리스트로 연결돼 있음.

_HEAP_SEGMENT 로 세그먼트 정보 조회하자.


+0x0b4 NonDedicatedListLength

: FreeList[0]에는 1016KB보다 크고 가상 할당 임계치보다는 작은 크기의 힙 블럭들이 모여있는데, 이 프리 리스트를 효율적으로 관리하기 위해 비전용(nondedicates) 리스트에서 이뤄진 할당 개수를 저장한다.

==> FreeList[0]로부터 할당받은 블럭들의 개수 !


+0xc4 FreeLists : _LIST_ENTRY

: 이중 연결 리스트로 연결된 프리 리스트가 나열된다. 각 리스트에는 특정 크기의 프리 힙 블록이 존재함.

(연결 정보 말고 블럭 정보를 보고 싶다면 _HEAP_ENTRY 로 조회하면 됨)

(_LIST_ENTRY 에서 보이는 주소는 유저 영역의 시작주소 이므로, metadata를 고려하여 -8한 주소로 조회해야함)


+0x0d4 : FrontEndHeap

프론트엔드 힙의 주소를 담는다.


+0x0da : FrontEndHeapType

: 프론트엔드 힙의 종류를 알려준다.

0x00 : 사용 안함 (백엔드로 전부 처리)

0x01 : LAL

0x02 : LFH (windows7 부터 default)


반응형