힙의 세부 항목 조회
힙 주소를 얻었으면 조회를 해봐야지.
명령어 : 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
+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)
'취약점 분석 > 힙(Heap)' 카테고리의 다른 글
힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) (0) | 2019.03.13 |
---|---|
힙 손상 탐지(1) - 초기화 안 된 상태로 사용 (0) | 2019.03.13 |
힙 블럭 합병(Coalecing), 해제 과정 (0) | 2019.03.12 |
힙 할당 메커니즘 (기초) (0) | 2019.03.09 |
전역플래그 GFlgas 설정 위치 (0) | 2019.03.09 |