취약점 분석/안티 리버싱

NtGlobalFlag, 우회방법

nightohl 2019. 2. 26. 20:47
반응형

안티 리버싱 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)

 힙 할당 시 파라미터 유효성을 검사?

세가지 flags가 OR연산으로 결합된 결과이다.


디버거로 프로그램을 여는 경우(Open Executable)에만 설정되고 (우회 필요),

프로그램을 실행시킨 상태에서 디버거에 Attach 한 경우에는 설정되지 않는다. (우회할 필요 없음)


[우회방법]


1) PEB.NTGlobalFlag 를 0x70 -> 0x00으로 패치.


2) 레지스트리 키 값 변경 -1

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<filename> (경로 필요없이 파일명만)

에서 GlobalFlag 값을 바꿈. (해당 프로세스 하나만 적용됨.)


* GlobalFlag 값이 디버깅 시 NtGlobalFlag 값이 됨.


3) 레지스트리 키 값 변경-2

HKLM\System\CurrentControlSet\Control\SessionManager

레지스트리의 GlobalFlag 값 변경. (전체 프로세스에 적용됨)


* GlobalFlag 값이 디버깅 시 NtGlobalFlag 값이 됨.


4) 환경 변수에 _NO_DEBUG_HEAP 을 추가한다. 


반응형