안티 리버싱 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 을 추가한다.
'취약점 분석 > 안티 리버싱' 카테고리의 다른 글
NtQueryInformationProcess - NoDebugInherit 우회방법 (0) | 2019.02.27 |
---|---|
안티 리버싱 - BP를 찾자. (0) | 2019.02.26 |
SeDebugPrivilege, 우회방법 (0) | 2019.02.26 |
FindWindow, 우회방법 (0) | 2019.02.26 |
IsDebuggerPresent, 우회 방법 (0) | 2019.02.26 |