취약점 분석/안티 리버싱

안티 리버싱 - BP를 찾자.

nightohl 2019. 2. 26. 21:51
반응형

안티 리버싱 - 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가 있다고 판단.

디버깅 중이구나!


반응형