본문 바로가기

힙의 세부 항목 조회 힙의 세부 항목 조회 힙 주소를 얻었으면 조회를 해봐야지.명령어 : 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 ..
wcscpy wcscpy는 유니코드를 복사하는 함수.길이 체크를 하지 않아 BOF를 유발 할 수 있음. (ASCII를 옮기는 strcpy와 같은 취약성을 지님) ASCII는 한 문자를 표현할 때 1byte 사용.UNICODE는 한 문자를 표현할 때 2bytes 사용 ASCII파일을 옮길 때AAAA(41414141) -> AAAA(4100410041004100)유니코드로 확장하면서 exploit 할 때 걸림돌이 되는 00이 붙음. ==> 애초에 유니코드로 작성하여 로드할 수 있는 환경이라면 애초에 유니코드로 작성하는 게 편함.# -*- coding: cp949 -*-
CheckRemoteDebuggerPresent, 우회방법 (최신) CheckRemoteDebuggerPresent 안티디버깅 기법, 우회 방법 Remote라고 해서 꼭 원격의 디버거만을 의미하는 게 아니라, 디버거가 별도의 병렬 프로세스에 존재한다는 것을 나타낸다. 내부적으로 IsDebuggerPresent or NtQueryInformationProcess 함수를 사용하여 호출 프로세스가 디버거에서 실행 중인지 여부를 탐지한다. CheckRemoteDebuggerPresentSyntax HANDLE hProcess [in]: 확인하고싶은 프로세스의 핸들 PBOOL pbDebuggerPresent [in, out]: 디버깅 중이냐 아니냐 값 True or False 반환됨. [CheckRemoteDebuggerPresent 함수 내부] 내부에서 2번째 인자로 Proce..
NtQueryInformationProcess - ProcessDebugObjectHandle 우회방법 NtQueryInformationProcess, ZwQueryInformationProcess - ProcessDebugObjectHandle참고URL : https://docs.microsoft.com/en-us/windows/desktop/procthread/zwqueryinformationprocess NtQueryInformationProcess는 ZwQueryInformationProcess의 wrapper 함수이다. [ ZwQueryInformationProcess 함수 ][Syntax] ProcessHandle: 정보를 받기를 원하는 프로세스의 핸들 ProcessInformationClass [in]: 받고자 하는 프로세스 정보 타입. (참고 URL을 보면 목록을 볼 수 있다.)문서화 되지 ..
NtQueryInformationProcess - ProessDebugPort 우회방법 NtQueryInformationProcess, ZwQueryInformationProcess - ProcessDebugPort참고URL : https://docs.microsoft.com/en-us/windows/desktop/procthread/zwqueryinformationprocess NtQueryInformationProcess는 ZwQueryInformationProcess의 wrapper 함수이다. [ ZwQueryInformationProcess 함수 ][Syntax] ProcessHandle: 정보를 받기를 원하는 프로세스의 핸들 ProcessInformationClass [in]: 받고자 하는 프로세스 정보 타입. (참고 URL을 보면 목록을 볼 수 있다.)ProcessDebugPor..