전체 글 195

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

FS 레지스터를 알아보자.

FS 레지스터를 알아보자. FS 레지스터는 유저모드에서 현재 스레드의 TEB(Thread Environment Block)을 가리킨다.FS 레지스터는 커널모드에서는 일반적으로 KPCR(Kernel Process Control Region)을 가리킨다. 사용자 어플리케이션의 안티리버싱 기법을 정리하고자 FS레지스터를 짚고있으므로 유저모드 입장에서 다룬다. in windbgdt _TEB 명령어를 입력 ==> TEB 구조체 구조 확인 가능. FS레지스터가 TEB주소를 담는다면, FS:[0x30] == TEB.ProcessEnvirionmentBlock == PEB 주소 !teb: 현재 스레드의 요약정보 / TEB 주소(0x7efdd000)를 얻고, dt _TEB 7efdd000 : 현재 스레드의 TEB 구조체..

Mutex 뮤텍스 API 함수 정리

Mutex 뮤텍스 API 함수 정리뮤텍스는 커널 모드 동기화 오브젝트 이다. 동기화를 위해 사용되는 API 함수들은 아래와 같다.1) CreateMutex : 뮤텍스 생성 (핸들 획득)2) OpenMutex : 뮤텍스 핸들 획득 (핸들 획득)3) ReleaseMutex : 뮤텍스 반환 [사용]WaitForSingleObject(hMutex, INFINITE); //뮤텍스 획득까지 기다림. ( 기다릴 뮤텍스의 핸들, 기다리는 시간 )//사용//ReleaseMutex(hMutex); API 함수들을 하나씩 살펴 보자.1) CreateMutexSyntax출처 : https://docs.microsoft.com/ko-kr/windows/desktop/api/synchapi/nf-synchapi-createmut..

(임계영역) CriticalSection API 함수 정리

(임계영역) CriticalSection API 함수 정리 뮤텍스와 비슷한 개념이지만, 임계영역은 '같은' 프로세스 내부의 스레드를 동기화 한다. (속도 더 빠름) 당연히 공유자원 사용에서 발생하는 문제를 유발하지 않으려면 한번에 하나의 스레드만 진입 해야한다.관련 API 함수를 알아보자. 출처 : https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-tryentercriticalsection [ 임계 영역 사용 흐름 ] 1) 임계영역 초기화InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 2) 임계영역 소유권 획득/반환 --- 상호 배타적 접근을 만족하며 프로세스..