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 |