728x90
728x90
728x90

파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17

 

Downloads / Lenas Reversing for Newbies - Tuts 4 You

 

tuts4you.com

Tutorials Index: 19. Debugger detected and anti-anti-techniques

사용도구: 올리디버거 2.01

 

Lena's Reversing for Newbie 19(이하 원본파일) 분석해보자.

 

19단계는 분석할 파일이 2개이다.

 

1. ReverseMe.A.exe

2. Debugger Detected.exe

 

첫 번째 ReverseMe.A.exe 파일부터 분석해보자.

 

 

[사진 1-1]

먼저 원본파일을 실행하면 위와 같다. 이 파일은 2단계에서 봤던 파일이다. 2단계를 아직 분석하지 않았다면 다음 링크를 참고하면 된다.

참고 링크: https://jade9reen.tistory.com/36

 

Lena's Reversing for Newbie 02 Write-Up

파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17 Downloads / Lenas Reversing for Newbies - Tuts 4 You tuts4you.com Tutorials Index: 02. Keyfiling the reverseme + assembler..

jade9reen.tistory.com

 

 

[사진 1-2]
[사진 1-3]

2단계와 거의 비슷하다. Keyfile.dat라는 파일을 열어서 내용을 확인하고 일치하면 성공 메시지 박스를 띄워준다.

 

 

[사진 1-4]

하지만 디버거에서 실행하면 위와 같이 실패한다. 2단계와 다른 점은 안티디버깅 기법이 추가된 것이다. [사진 3]에서 Keyfile.dat 파일의 내용을 확인하고 0x004010D3 주소에서 0x004010FB 함수를 호출한다.

그리고 IsDebuggerPresent 함수를 호출한다. 이 함수는 실행 중인 프로세스가 디버기인지 검사한다. IsDebuggerPresent 함수는 다음 링크를 참고하면 된다.

참고 링크: https://jade9reen.tistory.com/100

 

IsDebuggerPresent Function

https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent IsDebuggerPresent function (debugapi.h) Determines whether the calling process is being debugged by a user-m..

jade9reen.tistory.com

 

[사진 1-5]

디버깅중이기 때문에 IsDebuggerPresent 함수의 반환 값은 0x1 값이다. 0x00401100 주소의 CMP EAX, 1 명령어와 다음 명령어인 JE SHORT 004010E2 명령어 때문에 [사진 1-4]의 메시지 박스가 뜨는 것이다.

 

 

[사진 1-6]

따라서 IsDebuggerPresent 함수의 반환 값에 상관 없이 리턴하도록 NOP 명령어로 패치해주자. 그럼 리턴 주소인 0x004010D8 주소로 돌아갈 것이다.

 

 

[사진 1-7]

그리고 위와 같이 성공 메시지 박스 함수를 호출한다.

 

 

두 번째 Debugger Detected.exe 파일을 분석해보자.

 

[사진 2-1]

원본파일을 실행하면 위와 같다. Verify 버튼을 클릭해보자.

 

 

[사진 2-2]

디버거가 탐지되지 않았다고 한다.

 

 

[사진 2-3]

올리디버거로 원본파일을 열어서 실행하면 위와 같이 디버거가 탐지되었다고 한다.

 

 

[사진 2-4]

올리디버거로 프로그램을 실행한 뒤, code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. "Your debugger is detected !!!" 문자열이 3개가 보이는데, 모두 브레이크 포인트를 설정해주자.

 

 

[사진 2-5]

그리고 실행하면 0x0040123B 주소에서 중지된다. 디버거가 탐지되었다는 메시지 박스 함수를 호출 중인데, 이 곳은 0x00401223 주소의 JZ SHORT 00401234 명령어에 의해 실행된 것임을 알 수 있다.

0x0040120A ~ 0x00401225 주소의 반복 루틴을 보면 Process32Next 함수로 프로세스를 불러오고 lstrcmpiA 함수로 문자열을 비교하고 있다. 그리고 같으면 0x00401234 주소로 점프하여 [사진 2-3]의 메시지 박스를 띄워준다.

 

 

[사진 2-6]

따라서 0x0040120A 주소에 브레이크 포인트를 설정하고 다시 실행해주자. 반복 루틴을 시작하기 전에 CreateToolHelp32Snapshot 함수를 호출한다. 이 함수는 현재 실행 중인 모든 프로세스를 불러오는 함수이다. 그리고 반복 루틴을 시작하면서 Process32Next 함수로 프로세스들을 1개씩 가져오는 것이다.

위와 같이 첫 번째 프로세스인 "System" 문자열과 "OLLYDBG.EXE" 문자열을 비교하는 것을 확인할 수 있다.

 

 

[사진 2-7]

0x0040121A 주소에 브레이크 포인트를 설정하고 (F9) 단축키를 누르다 보면 위와 같이 실행 중인 올리디버거 "ollydbg.exe" 문자열과 "OLLYDBG.EXE" 문자열을 비교한다.

 

 

[사진 2-8]

따라서 0x00401234 주소로 점프할 것이다.

 

 

[사진 2-9]

위와 같이 lstrcmpiA 함수의 결과에 상관 없이 점프하지 않도록 NOP 명령어로 패치해주자. 그럼 [사진 2-2]처럼 실행될 것이다.

728x90
728x90

+ Recent posts