Lena's Reversing for Newbie 19 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
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 파일부터 분석해보자.
먼저 원본파일을 실행하면 위와 같다. 이 파일은 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
2단계와 거의 비슷하다. Keyfile.dat라는 파일을 열어서 내용을 확인하고 일치하면 성공 메시지 박스를 띄워준다.
하지만 디버거에서 실행하면 위와 같이 실패한다. 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
디버깅중이기 때문에 IsDebuggerPresent 함수의 반환 값은 0x1 값이다. 0x00401100 주소의 CMP EAX, 1 명령어와 다음 명령어인 JE SHORT 004010E2 명령어 때문에 [사진 1-4]의 메시지 박스가 뜨는 것이다.
따라서 IsDebuggerPresent 함수의 반환 값에 상관 없이 리턴하도록 NOP 명령어로 패치해주자. 그럼 리턴 주소인 0x004010D8 주소로 돌아갈 것이다.
그리고 위와 같이 성공 메시지 박스 함수를 호출한다.
두 번째 Debugger Detected.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다. Verify 버튼을 클릭해보자.
디버거가 탐지되지 않았다고 한다.
올리디버거로 원본파일을 열어서 실행하면 위와 같이 디버거가 탐지되었다고 한다.
올리디버거로 프로그램을 실행한 뒤, code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. "Your debugger is detected !!!" 문자열이 3개가 보이는데, 모두 브레이크 포인트를 설정해주자.
그리고 실행하면 0x0040123B 주소에서 중지된다. 디버거가 탐지되었다는 메시지 박스 함수를 호출 중인데, 이 곳은 0x00401223 주소의 JZ SHORT 00401234 명령어에 의해 실행된 것임을 알 수 있다.
0x0040120A ~ 0x00401225 주소의 반복 루틴을 보면 Process32Next 함수로 프로세스를 불러오고 lstrcmpiA 함수로 문자열을 비교하고 있다. 그리고 같으면 0x00401234 주소로 점프하여 [사진 2-3]의 메시지 박스를 띄워준다.
따라서 0x0040120A 주소에 브레이크 포인트를 설정하고 다시 실행해주자. 반복 루틴을 시작하기 전에 CreateToolHelp32Snapshot 함수를 호출한다. 이 함수는 현재 실행 중인 모든 프로세스를 불러오는 함수이다. 그리고 반복 루틴을 시작하면서 Process32Next 함수로 프로세스들을 1개씩 가져오는 것이다.
위와 같이 첫 번째 프로세스인 "System" 문자열과 "OLLYDBG.EXE" 문자열을 비교하는 것을 확인할 수 있다.
0x0040121A 주소에 브레이크 포인트를 설정하고 (F9) 단축키를 누르다 보면 위와 같이 실행 중인 올리디버거 "ollydbg.exe" 문자열과 "OLLYDBG.EXE" 문자열을 비교한다.
따라서 0x00401234 주소로 점프할 것이다.
위와 같이 lstrcmpiA 함수의 결과에 상관 없이 점프하지 않도록 NOP 명령어로 패치해주자. 그럼 [사진 2-2]처럼 실행될 것이다.
'Wargame > Lena’s Reversing for Newbies' 카테고리의 다른 글
Lena's Reversing for Newbie 21 Write-Up (2) | 2019.08.16 |
---|---|
Lena's Reversing for Newbie 20 Write-Up (0) | 2019.08.09 |
Lena's Reversing for Newbie 18 Write-Up (0) | 2019.08.09 |
Lena's Reversing for Newbie 17 Write-Up (0) | 2019.08.08 |
Lena's Reversing for Newbie 16 Write-Up (0) | 2019.08.08 |