Q. This program can detect debuggers. Find out the name of the debugger detecting function the program uses.
그림 1
최초 프로그램을 실행해보면, 정상이라는 글이 일정 시간간격으로 출력되는 것을 볼 수있다.
그러나, 올리디버거로(또는 다른 디버깅 툴) 실행시,
그림 2
이러한 메인 루틴을 지나게 되면
그림 3
디버깅 당하고 있음을 출력하는 문자열을 볼 수 있다.
메인 루틴(그림 2)을 살펴 보면 문제에서 요구하는 답을 직관적으로 (IsDebuggerPresent) 알 수 있으며, 일정 시간을 두면서 문자열을 출력하는 이유 또한 알 수 있다.(Sleep함수)
보이는 바와 같이 IsDebuggerPresent함수는 Kernerl32.dll에 속해 있고, 디버깅을 당하고 있을시 non-zero, 디버깅을 당하고 있지 않다면 zero를 리턴한다.
MSDN참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms680345(v=vs.85).aspx
문제에 대한 답은 찾았으나, 디버깅을 하면서도 정상 이라는 문자열을 출력해보고 싶었다.
가장 쉽게 처음 생각한 방법은 IsDebuggerPresent함수를 지나 후에 있는
TEST eax,eax 를 mov eax, 0으로 바꾸어보는 것이였다. 리턴 값을 조정해주면 내부가 어떻든간에
쉽게 해결될꺼라고 생각했는데, 정말 멍청한 생각이였음.
test 명령어는 두 값을 비교하여 플래그를 수정한다.
TEST 명령어는 피연산자들을 AND연산하여 즉, 두 피연산자중 하나라도 0이면 ZF = 1로 셋팅된다.
따라서 test eax, eax라는 것은 eax가 0인지 아닌지를 판별하는 명령어를 의미하게 된다.
CMP명렁어와 다른점은 두 피연산자들의 뺄셈연산을하여 같은지 다른지를 비교하는 것으로 차이점이 있다.
test명령어 아래에 나타나는 JE명령어는 이 ZF가 1이면 점프분기하는 조건분기 명령어중 하나이다.
따라서 단순 mov eax, 0으로 바꾸게 된다면 ZF값을 수정해 주지 못함으로써 아래의 JE조건분기를 수행할 수 없어서
프로그램이 뻗게되었다.
다음 방법으로 생각 한 것은 IsDebuggerPresent함수 내부에서 리턴 하기 전에 리턴 값을 0으로 수정해보기로 하였다.
함수 내부로 진입해 점프를 두 번 수행 하고 나니
그림 4
이 세개의 명령어 수행후 리턴을 하게 되었다. 이때 eax값은 7efde000, 따라서 7efde002 메모리번지에 있는 값으로 셋팅된 후 리턴 하게 된다는 것을 알게 되었고, 이 메모리 번지로 찾아갔다.
그림 5
BeingDebugged = TRUE로 되어있는 것을 보면 이 값을 리턴되었을때 디버깅이 되고있음을 의미한다는 것을 확실히 확신할 수 있었지만, 이 값을 변경 할 수 없었으며,
반대의 의미를 리턴하는 값을 아래에서 찾을 수 없었다.(찾게 된다면 74f33785의 movzx문을 수정해볼 생각이였다.)
왜 변경 할 수 없었는지에 대한 의문.... 잘 모르겠다.
kernerl32.dll에 있기 때문이거나, dll에 있는 부분이여서 동적으로 할당 되는 부분을 수정할 수 없기 때문이 아닌가 하고 생각만 해봄...ㅠㅠ
결국 IsDebuggerPresent함수 내부를 수정하는 것도 실패하고, 남은 방법은
메인 루틴에서 test명령어 이후에 나타나는 je명령어를 jmp로 수정하는 방법밖에 떠오르지 않아서, 수정해보았더니
디버깅 중에도 정상으로 출력하는 것을 볼 수 있었다.
결국 돌아돌아서 별 거 아닌 패치를 했지만, IsDebuggerPresent함수 내부를 한번 들여다 본 것과
단순 레지스터들의 값들뿐만아니라 여러 플래그들도 같이 둘러봐야 된다는 교훈을 얻게된 것같다.
'Study > ETC' 카테고리의 다른 글
실전 악성코드와 멀웨어 분석 Lab03_03.exe (0) | 2014.09.01 |
---|---|
실전 악성코드와 멀웨어 분석 Lab03-02.dll (0) | 2014.08.29 |
실전 악성코드와 멀웨어 분석 Lab03-01.exe (0) | 2014.08.11 |
IA-32 Register 기본 설명 - 1 (0) | 2013.10.08 |
같은 네트워크 망에 접속한 아이피어드레스 서치하기! (2) | 2013.06.21 |