NtGlobalFlag

- 프로세스가 디버깅 중일 때 PEB.NtGlobalFlag 멤버(+0x68)의 값은 0x70으로 설정된다.

- PEB.NtGlobalFlag 값은 

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

→ Heap 메모리가 해제되었을 때, 버퍼 오버런을 검사한다.

→ 이 Flag는 각 할당된 부분의 끝에 짧은 패턴을 추가한다. 윈도우 힙 매니저는 블록이 해제됐을 때 이러한 패턴들을 감지하고, 블록들이 수정되었을 때 디버거에 들어간다.

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

→ Heap 메모리가 해제되었을 때, Heap의 할당부분을 검사한다.

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

→ Heap 함수가 호출 될 때마다, Heap의 선택된 부분을 검사한다.

  상위 3개의 Flags들의 bit OR 연산이다.

- 디버깅 프로세스의 Heap 메모리에는 일반 실행 프로세스와는 다른 특별한 표시가 존재한다. 이를 위해 PEB.NtGlobalFlag 멤버에 위와 같은 Flag들이 추가된다.

- 실행 중인 프로세스에 디버거를 Attach시킨 경우에 NtGlobalFlag 값은 변하지 않는다.


[C언어로 작성한 예제 파일]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <windows.h>
 
FARPROC pProc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCurrentTeb");
LPBYTE pTEB = (LPBYTE)(*pProc)();
LPBYTE pPEB = (LPBYTE)*(LPDWORD)(pTEB+0x30);
 
int NtGlobalFlag();
 
int main(){
    while(1){
        if(NtGlobalFlag() != 0){
            printf("Debugging!!!\n");
        }
        else{
            printf("Not Debugging...\n");
        }
        Sleep(1000);
    }
 
    puts("");
    return 0;
}
 
int NtGlobalFlag(){
    DWORD NtGlobalFlag = *(LPDWORD)(pPEB+0x68);
    printf("NtGlobalFlag : %x, ", NtGlobalFlag);
    return (NtGlobalFlag & 0x70);
}
cs


○ 디버깅 중일 때의 모습이다. (Windows XP 환경)


○ PEB.NtGlobalFlag의 값이 0x00000070인것을 알 수 있다.


[우회 방법] : PEB.NtGlobalFlag의 값을 0x00으로 설정하면 된다.

○ NtGlobalFlag의 값을 0으로 설정했다.


○ 우회한 것을 확인할 수 있다.


참고 : 리버싱 핵심원리(책), Windows 구조와 원리(책), MSDN

'Reversing' 카테고리의 다른 글

Static Anti-Debugging 0x03. Process Heap  (0) 2016.07.07
Static Anti-Debugging 0x02. LDR  (0) 2016.07.06
Static Anti-Debugging 0x01. IsDebuggerPresent()  (0) 2016.07.06
Anti-Debugging  (0) 2016.07.06
PEB 구조  (2) 2016.07.05

+ Recent posts