[WinDbg] Heap Corrupt - Overrun

힙오버런의 경우는 초기화안된 상태의 결과와는 틀릴 수 있다. 그냥 실행하는 경우에 문제가 없다고 나올 수 있는 것이다.

경험적으로 초기화안된 상태의 경우("Heap 손상 - 초기화안된 상황" 참조)
디버거에서 실행하는 경우 : 채움패턴으로 인해서 바로 AV를 발생시켜줌
그냥 실행하는 경우 : 보통 프로세스 종료시 문제 발생

힙오버런의 경우
디버거에서 실행하는 경우 : "Heap block at 00152E50 modified at 00152E6C past requested size of 14" 왼쪽과 같은 메시지를 뿌려준다. 아래 참조
보통 이 경우를 확인하는 첫번째 방법으로는 세그먼트가 정상적으로 보존되어 있는지를 확인해 보는것이 먼저 해야 할 순서이다. !heap 명령어를 쓰거나 Segments 멤버의 링크되어 있는 노드를 순서적으로 접근을 해 본다. 이렇게 해 보면 보통의 경우는 가장 마지막 노드의 메타데이터가 깨져 있는 것을 알 수가 있다.
그냥 실행하는 경우 : 이상없이 종료됨

00152e50  06 00 07 00 7d 07 1c 00-30 00 31 00 32 00 33 00  ....}...0.1.2.3.
00152e60  34 00 35 00 36 00 37 00-38 00 39 00
30 00 31 00  4.5.6.7.8.9.0.1.
00152e70  32 00 33 00 34 00 35 00-36 00 37 00 38 00 39 00  2.3.4.5.6.7.8.9.
파란색 : 메타데이터(8바이트)
빨간색 : 할당된 유저 영역(20바이트)
녹색 : 후위바이트영역(이 부분을 넘어서 사용하고 있어서 힙손상을 일으키고 있다.)

일반페이지힙을 설정한 후에 그냥 실행하는 경우에는 어플리케이션 베리파이어의 영향으로 손상지점을 좀더 쉽게 파악할 수가 있다.
gflags -p /enable "이미지 풀패스" 엔터

일반페이지힙과 비교해서 완전페이지힙은 손상시점의 확인을 나중에 확인이 아니라 즉시 확인을 할 수 있으나 너무 많은 자원을 소비하기 때문에 사용에 신중을 기해야 한다. 일단 이 부분은 패스...

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception