취약점 분석/안티 리버싱 9

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..

NtQueryInformationProcess - NoDebugInherit 우회방법

NtQueryInformationProcess, ZwQueryInformationProcess - NoDebugInherit참고URL : https://docs.microsoft.com/en-us/windows/desktop/procthread/zwqueryinformationprocess NtQueryInformationProcess는 ZwQueryInformationProcess의 wrapper 함수이다. [ ZwQueryInformationProcess 함수 ][Syntax] ProcessHandle: 정보를 받기를 원하는 프로세스의 핸들 ProcessInformationClass [in]: 받고자 하는 프로세스 정보 타입. (참고 URL을 보면 목록을 볼 수 있다.)하지만 지금 살펴볼 값은 문서화..

안티 리버싱 - BP를 찾자.

안티 리버싱 - BP를 찾자. 디버깅을 어떻게 하는가?원하는 부분에 BP를 걸고 실행시킨 후, 원하는 지점부터 분석을 시작한다.그렇다면 BP를 찾으면 디버깅 중이라는 뜻이 아니겠나?==> BP가 있다면 디버깅 중이다!! 1) 소프트웨어 BreakPointINT 3h / 0xCC 를 찾자. 그냥 0xCC를 찾는다면 공격자가 쉽게 찾아서 우회가 가능할 것이다.그렇다면,if( 0x99 == (tmpchar ^ 0x55) ) //0xCC xor 0x55 == 0x99print "디버깅 중이구나";return true; 이런식으로 한번 더 꼬아주면 좀 더 찾기가 어려워 지겠지 호호홍 2) 메모리 BreakPoint1) 일반적인 상황에서 가드 페이지(PAGE_GUARD) 메모리 주소에 접근 시,2) STATUS_G..

SeDebugPrivilege, 우회방법

안티 리버싱 SeDebugPrivilege, 우회방법 일반적으로 프로세스는 접근 토큰 내에 SeDebugPrivilege 특권이 비활성화 되어있다. 프로세스가 디버거에 연결된 경우 "SeDebugPrivilege" 특권이 활성화 됨. SeDebugPrivilege 특권 : 해당 특권이 활성화 되면, 프로세스 관리자는 프로세스나 스레드의 보안 디스크립터에 상관없이 NtOpenProcess나 NtOpenThread를 사용해 어떤 프로세스나 스레드에 대한 접근을 허용함. ==> PROCESS_ALL_ACCESS 권한으로 OpenProcess() 함수를 호출하더라도 잘 실행됨. [안티디버깅] ALL_ACCESS 권한으로 잘 열리면, 디버깅 중이구나!! [우회방법] 1) ntdll!NtOpenProcess() 반..

NtGlobalFlag, 우회방법

안티 리버싱 NtGlobalFlag, 우회방법 PEB(Process Environment Block)의 (+0x68) 요소인 NtGlobalFlag값이 디버깅 중엔 0x70으로 설정됨. 0x70은 Flag Meaning FLG_HEAP_ENABLE_TALK_CHECK (0x10) 이 flag가 set 되었다면,1) 힙 할당 시 끝 부분에 짧은 패턴을 추가하고,2) Heap 메모리 해제 시 패턴이 수정되었는 지 확인.==> 힙 버퍼 오버 플로우 감지. FLG_HEAP_ENABLE_FREE_CHECK (0x20) 힙 메모리 해제 시, Heap의 할당 부분을 검사함.헤더가 변경됐는지 확인.이 역시 힙 버퍼 오버플로우 감지. FLG_HEAP_VALIDATAE_PARAMETERS (0x40) 힙 할당 시 파라미터..

FindWindow, 우회방법

안티리버싱 FindWindow, 우회방법 [ FindWindow API ]클래스네임과 윈도우네임이 일치하는 top-level 윈도우가 있다면 핸들을 반환.없다면 0 반환. [파라미터]LPCTSTRlpClassName: class name 또는 atom을 나타내는 null로 끝나는 문자열 포인터.atom이라면 GlobalAddAtom으로 생성된 global atom이어야 한다.atom은 16bit 값으로, lpClassName (4bytes)의 high-order word(2bytes)는 0으로 채우고 나머지 low-order word(2bytes)에 atom값이 위치해야 한다. LPCTSTRlpWindowName: window name (window title)을 나타내는 null 종료 문자열 포인터.n..

IsDebuggerPresent, 우회 방법

안티리버싱 IsDebuggerPresent [IsDebuggerPresent]IsDebuggerPresent 내부를 들여다 보자꾸나.mov eax, dword ptr fs:[18h] //TEB.self를 eax에 (TEB주소 그대로 eax로)mov eax, dword ptr [eax+30h] //TEB.PEB를 eax에 (PEB 주소를 eax에)movzx eax, byte ptr [eax+2] //PEB.BeingDebugged (디버깅 중이라면 1, 아니라면 0)ret 요약 : PEB.BeingDebugged 값을 eax에 담고 리턴. [TEB]fs:[18h] == 현재 스레드 TEB 주소.[eax+30h] == TEB에서 PEB주소 획득. [PEB][eax+2] == PEB의 BeingDebugged..