취약점 분석/안티 리버싱

NtQueryInformationProcess - NoDebugInherit 우회방법

night-Ohl 2019. 2. 27. 14:06
반응형

NtQueryInformationProcess, ZwQueryInformationProcess - NoDebugInherit

참고URL : https://docs.microsoft.com/en-us/windows/desktop/procthread/zwqueryinformationprocess


NtQueryInformationProcessZwQueryInformationProcess의  wrapper 함수이다.


[ ZwQueryInformationProcess 함수 ]

[Syntax]


ProcessHandle

: 정보를 받기를 원하는 프로세스의 핸들


ProcessInformationClass [in]

: 받고자 하는 프로세스 정보 타입. (참고 URL을 보면 목록을 볼 수 있다.)

하지만 지금 살펴볼 값은 문서화 되지 않은 값 ProcessDebugFlags(0x1f)을 넘기는 경우를 살펴본다.


ProcessInformation [out]

: ProcessInformation을 받아올 버퍼 주소


ProcessInformationLength [in]

: 받아올 정보의 길이


ReturnLength [out]

: 성공적으로 잘 받아왔다면 ProcessInformationLength와 값이 같고, 실패했다면 information을 받는데 필요한 최소 크기를 명시해줌.


[안티 디버깅]

1) 두번째 인자의 값을 문서화 되지 않은 값인 ProcessDebugFlags(0x1f)를 넘기면,

2) EPROCESS Flags 의 NeDebugInherit Bit Flag 값을 반환 받음.

3) 0 : 디버깅 중! / 1 : 디버깅 아니네?


EPROCESS Flags 참고 URL

EPROCESS의 1byte Flags에는 각 비트별로 의미하는 플래그들이 다르다. (자세한 건 URL 참조)

그 중에서 우리는 NoDebugInherit 비트 플래그 (1 or 0) 값을 반환 받아서 디버깅 중인지 판별한다.


[우회 방법]

3번째 인자를 메모리에 띄워놓고 함수 호출 후 1로 바꿈. (0아님! 주의!)


반응형