본문 바로가기

힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap) 힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap)힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 를 먼저 읽고 보자. gflags를 이용한 풀 페이지힙 적용 방법gflags.exe /p /enable /full/p : 페이지 힙/enable : 특정 옵션을 킴/full : 풀 옵션으로~! [ 풀 페이지 힙 - 할당 ][시나리오]1) 0x30 크기만큼의 힙을 할당 / 해제.2) Full PageHeap 적용 후 windbg에서 분석 1) 0x30 크기의 힙을 요청에 성공하고2) EAX에 유저 영역 시작 주소를 반환 받았다. 명령어 : !address 할당받은 0x30크기의 힙을 !address로 봤더니 Heap이 아닌 PageHeap으로 뜨는 것을 볼..
힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 힙 버퍼 오버플로우. 참 많이 접해 본 단어이다.할당된 공간을 넘어서 인접한 다른 힙 청크를 덮어쓰는 것 뿐인데 어떤 문제를 야기할 수 있을까?예를 들어보자.덮어써진 힙에서 참조한 값으로 출발지 힙의 크기를 계산하여 소스힙을 할당한다던지 -> 또 다른 버퍼오버플로우 유발 가능.덮어써진 영역이 가상함수 테이블이라면..? -> 가상함수 호출 시 EIP가 제어됨. 띠용?!메타데이터가 변조되어 링크가 엉뚱한 곳을 가리키고, 이후 힙 할당/해제 시에 문제를 유발할 수 있음.결론적으로 취약점을 정교하게 잘 악용한다면 프로그램의 실행흐름(EIP)도 가져올 수 있다는 얘기다. 힙 버퍼 오버플로우는 스택과 다르게 원인이 되는 부분과 한참 떨어..
힙 손상 탐지(1) - 초기화 안 된 상태로 사용 힙 손상 탐지(1) - 초기화 안 된 상태로 사용 공간을 할당했으면 초기화를 하고 사용해야함.포인터 변수를 다뤄봤다면 알겠지만, 뭐가 들었을 지 알고 초기화도 안하고 사용하나?! 1) 할당만 받고 초기화 하지 않은 채 사용한다면 문제가 발생할 수 있으므로 잡아야한다.2) Free 한 이후에도 사용하는 것은 문제를 야기할 수 있고 정상적인 사용방법이 아니다.스택은 문제를 야기하는 원인 근처에서 크래시가 발생하므로 추적이 쉬움.힙 문제는 원인과 결과가 한참 차이나는 경우가 많음 (변조는 이미 되었으나 오류 발생은 실제 사용 시점에서 발생하므로)Crash 시점부터 백트레이스는 너무 많은 비용 소모, 힙 손상이 발생 시점에 트랩하자.대안: 디버깅 하에서 실행 시 채움 패턴 사용.(디버거 하에서 프로세스를 시작한..
힙의 세부 항목 조회 힙의 세부 항목 조회 힙 주소를 얻었으면 조회를 해봐야지.명령어 : dt _HEAP 0:000> dt _heap 00500000ntdll!_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 : 0..
힙 블럭 합병(Coalecing), 해제 과정 힙 블럭 합병(Coalecing), 해제 과정 [ 합병(Coalecing) ]1) free된 영역이 서로 인접하다면2) 병합시켜 큰 블럭으로 관리.과정:힙 블럭 해제 요청 -> 인접 영역이 free 상태인지 확인 -> 그렇다면 병합 -> 프리리스트 갱신 인접한 free 블럭을 기존 프리리스트에서 제거, 합병과정을 거친 후 합병된 블럭을 크기에 맞는 프리리스트로 갱신-> 비용이 많이듬! 그런데도 굳이 합병을 하는 이유는??: 힙 단편화(heap fragmentation)를 회피하기 위해. 합병 방식을 알았으니, 합병을 고려한 힙 해제 과정을 정리하자. [ 힙 해제 과정 ]1) 프런트엔드 할당자가 해당 프리 블록을 처리할 수 있는 지 요청.2) 힙 관리자는 인접한 프리블록이 있는 지 확인.3) 있다면 합병인..
힙 할당 메커니즘 (기초) 힙 할당 메커니즘 모든 힙 블럭에는 힙 정보를 포함하는 힙 메타데이터 8bytes를 포함한다.따라서 8bytes를 요청하였을 경우 +8된 16bytes의 힙 청크가 있는 지 찾는다. 프론트엔드 할당자도 백엔드의 프리리스트도 블럭 크리별로 나뉘어져 각각이 링크드 리스트로 관리된다.그런데, 힙 요청은 8bytes 단위로 요청하나 힙 블럭에는 항상 힙 메타데이터가 포함되므로 8bytes는 요청할 수 없다. ==> 따라서 프리리스트의 [0]번째 인덱스는 사용되지 않거나 특수 목적으로 사용된다.- 프론트엔드 할당자는 [0]인덱스를 사용하지 않음.- 백엔드 할당자는 [0]인덱스에 [127]번째 블럭 크기보다 크면서 Virtual Alloc을 해야할 정도로는 크지 않는 힙들을 전부 담는다. [할당 작업 순서]1) 프..
전역플래그 GFlgas 설정 위치 전역플래그 GFlgas 설정 위치디버깅 시 필요한 기능들을 껏다 켰다 할 수 있는 GFLag. 1) 설정이 저장되는 위치는 어디이며, 해석은 어떤 방식으로 되는가?시스템 전역 설정 :HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\GrobalFlag 프로세스 단위 설정 :HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ Current Version\Image File Execution Options\\ GrobalFlag 2) 서비스 제어 매니어제 의해 시작된 서비스를 디버깅하고자 한다면, (내가 실행하지 않은) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows ..
실질적으로 할당된 힙 크기 구하기 동적으로 할당되는 힙(heap)의 정확한 크기 구하기. 할당받는 힙의 크기는 요청한 크기와 정확하게 일치할 때도 있지만 조금의 차이가 있을 수도 있다.요청한 Size와 동일한 크기의 Chunk가 존재한다면 딱 맞게 주겠지만, 아니라면 조금 더 큰 Chunk에서 잘라내어 할당하기도 한다. Chunk의 크기는 8bytes의 배수이기 때문이다. 따라서 요청한 Heap 크기보다 조금 더 크게 할당 될 수도 있다.(=-> 때문에, Bins로 관리 시 Size의 나머지 3bit를 | N | M | P |의 Flags로 사용함.) 코딩 시 할당된, 사용 가능한 힙 크기를 정확하게 알아야할 때가 있는데 함수를 통해 구하는 법을 알아보자. 윈도우즈 플랫폼 같은 경우는_msize(힙주소) 리눅스와 유닉스의 경우에는mall..