안티 리버싱 - BP를 찾자.
디버깅을 어떻게 하는가?
원하는 부분에 BP를 걸고 실행시킨 후, 원하는 지점부터 분석을 시작한다.
그렇다면 BP를 찾으면 디버깅 중이라는 뜻이 아니겠나?
==> BP가 있다면 디버깅 중이다!!
1) 소프트웨어 BreakPoint
INT 3h / 0xCC 를 찾자.
그냥 0xCC를 찾는다면 공격자가 쉽게 찾아서 우회가 가능할 것이다.
그렇다면,
if( 0x99 == (tmpchar ^ 0x55) ) //0xCC xor 0x55 == 0x99
print "디버깅 중이구나";
return true;
이런식으로 한번 더 꼬아주면 좀 더 찾기가 어려워 지겠지 호호홍
2) 메모리 BreakPoint
1) 일반적인 상황에서 가드 페이지(PAGE_GUARD) 메모리 주소에 접근 시,
2) STATUS_GUARD_PAGE_VIOLATION 예외가 발생함.
BUT, 디버깅 중일 시 디버거가 처리하여 예외가 발생하지 않음.
예외가 발생하지 않는다면? --> 디버깅 중이로다!!
3) 하드웨어 BreakPoint
GetThreadContext, SetThreadContext API 함수를 이용.
Dr0 ~ Dr3에 HWBP가 저장됨.
bool IsHWBreakpointExists()
{
// This structure is key to the function and is the
CONTEXT ctx;
ZeroMemory(&ctx, sizeof(CONTEXT));
// The CONTEXT structure is an in/out parameter therefore we have
// to set the flags so Get/SetThreadContext knows what to set or get.
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
// Get a handle to our thread
HANDLE hThread = GetCurrentThread();
// Get the registers
if(GetThreadContext(hThread, &ctx) == 0)
return false;
if ((ctx.Dr0) || (ctx.Dr1) || (ctx.Dr2) || (ctx.Dr3)) {
return true;
}
else {
return false;
}
}
CONTEXT_DEBUG_REGISTERS로 문맥을 받아와서 Dr0~Dr3에 값이 있다면 HWBP가 있다고 판단.
디버깅 중이구나!
'취약점 분석 > 안티 리버싱' 카테고리의 다른 글
NtQueryInformationProcess - ProessDebugPort 우회방법 (0) | 2019.02.27 |
---|---|
NtQueryInformationProcess - NoDebugInherit 우회방법 (0) | 2019.02.27 |
SeDebugPrivilege, 우회방법 (0) | 2019.02.26 |
NtGlobalFlag, 우회방법 (0) | 2019.02.26 |
FindWindow, 우회방법 (0) | 2019.02.26 |