Lena's Reversing for Newbie 10 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials Index: 10. Continued reversing techniques in VB, use of decompilers and a basic anti-anti-trick
사용도구: 올리디버거 2.01
Lena's Reversing for Newbie 10(이하 원본파일) 분석해보자.
10단계는 분석할 파일이 3개이다.
1. Tut.ReverseMe1
2. cconvert
3. ReverseMe2
첫 번째 Tut.ReverseMe1 파일부터 분석해보자.

원본파일을 실행하면 Nag 창이 뜬다. 확인 버튼을 클릭해보자.

위와 같이 Regcode를 입력할 수 있는 창이 뜬다.

Nag? 버튼을 클릭하면 [사진 1-1]에서 보였던 Nag 창이 뜬다.

Regcode를 입력하고 Register me! 버튼을 클릭하면 실패 메시지 박스가 뜬다.

먼저 원본파일을 실행하여 [사진 1-1] 상태로 만든다. 그 다음에 올리디버거의 상단 메뉴 중 File - Attach... 기능을 통해 위와 같이 실행 중인 Nag Screen 프로세스를 Attach 하면 된다.

그러면 위와 같이 프로세스가 중지된 상태로 올리디버거에서 디버깅을 할 수 있다. 올리디버거의 우측 하단을 보면 확인할 수 있다.

그 다음 올리디버거의 상단 메뉴 중 Debug - Execute til user code 기능을 클릭하고 Nag 창에서 확인이나 취소 버튼을 클릭하면 위와 같이 어떠한 함수를 종료하고 다음 명령어에서 중지된다. 0x00402CFE 주소의 CALL 함수 명령어가 Nag 메시지 박스 함수를 호출하는 곳이다.

Nag 메시지 박스 함수를 호출하는 루틴의 윗 부분을 살펴보면 위와 같이 메시지 박스에서 사용되었던 문자열들을 확인할 수 있다. 즉, 이 루틴이 Nag 창을 실행시키는 루틴인 것이다. 따라서 함수 프롤로그의 시작인 PUSH EBP 명령어를 패치하면 된다.

위와 같이 RETN 명령어로 패치하면 프로그램을 시작하거나 Nag 버튼을 클릭하여 Nag 창을 띄우는 루틴에 들어와도 RETN 명령어에 의해 곧바로 종료되고 Nag 메시지 박스는 뜨지 않는다.

이제 Regcode를 찾아야 한다. 마찬가지로 [사진 1-4]의 상태로 만든 뒤, 올리디버거의 상단 메뉴 중 Debug - Pause 기능을 통해 중지 상태로 만든다. 그리고 Debug - Execute til user code 기능을 클릭하고 Regcode 메시지 박스에서 확인 버튼을 클릭하면 위와 같이 어떠한 함수를 종료하고 다음 명령어에서 중지된다. 0x00402AE8 주소의 CALL 함수 명령어가 Nag 메시지 박스 함수를 호출하는 곳이다.

Regcode 메시지 박스 함수를 호출하는 루틴의 윗 부분을 살펴보면 "I'mlena151" 문자열을 vbaStrCmp 함수에 인자로 전달한다. vbaStrCmp 함수는 Visual Basic에서 문자열을 비교하는 함수이다. 이 곳에 브레이크 포인트를 설정하고 Regcode를 입력해보자.

그러면 위와 같이 입력한 Regcode "1234"와 "I'mlena151" 문자열이 vbaStrCmp 함수의 인자도 전달되는 것을 확인할 수 있다.

"I'mlena151" 문자열을 Regcode로 입력하면 위와 같이 성공 메시지 박스가 뜨는 것을 확인할 수 있다.
두 번째 cconvert 파일을 분석해보자.

원본파일을 실행하면 바로 체험판이라는 내용의 메시지 박스가 호출된다.

프로그램이 실행되면 위와 같이 진법을 변환해주는 프로그램인 것을 알 수 있다.

변환 기능은 잘 동작한다.

About 버튼을 클릭하면 위와 같이 프로그램에 대한 내용이 나온다. Register 버튼을 클릭해보자.

그러면 User Name, Registration Code 두 개의 값을 입력받는다.

실패했을 때의 메시지 박스는 위와 같다.

먼저 원본파일을 실행하여 [사진 2-6] 상태로 만든다. 그 다음에 올리디버거의 상단 메뉴 중 File - Attach... 기능을 통해 위와 같이 실행 중인 About CrackersConvert v1.0 프로세스를 Attach 하면 된다.

그러면 위와 같이 프로세스가 중지된 상태로 올리디버거에서 디버깅을 할 수 있다. 올리디버거의 우측 하단을 보면 확인할 수 있다.

그 다음 올리디버거의 상단 메뉴 중 Debug - Execute til user code 기능을 클릭하고 실패 메시지 박스에서 확인 버튼을 클릭하면 위와 같이 어떠한 함수를 종료하고 다음 명령어에서 중지된다. 0x0040A13C 주소의 CALL 함수 명령어가 실패 메시지 박스 함수를 호출하는 곳이다.

실패 메시지 박스 함수를 호출하는 루틴의 윗 부분을 살펴보면 위와 같이 "REG-", "-CODE" 문자열을 붙이고 있지만, 이외에 1번 문제 Tut.ReverseMe1 파일처럼 특정한 값이 하드코딩되어 있지 않다. 따라서 정확한 User Name, Registration Code를 찾기 위해 루틴의 첫 부분부터 살펴봐야 한다.

루틴의 시작은 0x00409C70 주소이다. 이 곳에 브레이크 포인트를 설정하고 User Name에 "ABCD", Registration Code에 "1234" 값을 입력하고 실행하면 디버깅할 수 있다. 코드가 굉장히 길어서 중요한 부분만 살펴보자.


먼저 vbaLenBstr 함수로 User Name 값의 길이를 리턴해주는데, User Name 값이 "ABCD"일 때의 vbaLenBstr 리턴 값은 [사진 2-13]과 같다. 그리고 리턴된 값과 0x1 값을 비교하여 SETG 명령어로 DL 레지스터의 값을 세팅한다.
그리고 EDX 레지스터의 값을 반전시키는데 만약 리턴된 EAX 레지스터의 값이 0x0, 0x1일 경우 반전된 EDX 레지스터의 값은 0x0이다.
그리고 vbaFreeStr, vbaFreeObj 함수를 거치면서 SI, BX 레지스터의 값이 세팅되는데 두 값이 같을 경우 0x0040A236 주소로 점프한다. 두 값이 같을 경우는 vbaLenBstr 함수의 리턴 값이 0x0, 0x1일 때이다.

0x0040A236 주소로 점프하면 위와 같은 메시지 박스 창이 뜨고 종료된다. 따라서 User Name 값의 길이는 2 이상 되도록 입력해야 한다.

Registration Code 값을 검사하기 전에 여러 함수들이 호출된다. 이 과정에 추가적으로 User Name 값을 검증하는 곳은 없다. 따라서 User Name 값은 단지 길이가 2 이상이면 되는 것이다. 그리고 위의 함수들은 Visual Basic의 string 구조를 유니 코드와 아스키 코드로 변환해주는 것이기 때문에 중요하지 않다.

다음은 Registration Code 값의 길이를 검사하는 부분이다. [사진 2-12]와 마찬가지로 Registration Code의 길이가 2 미만이면 0x0040A1B6 주소로 점프한다.

0x0040A1B7 주소로 점프하면 위와 같은 메시지 박스 창이 뜨고 종료된다. 따라서 Registration Code 값의 길이는 2 이상 되도록 입력해야 한다.

다음은 vbaVarCat 함수에 3개 인자를 전달하는데, 이 과정에서 별도로 스택에 "REG-", "-CODE" 문자열을 저장한다. vbaVarCat 함수는 Visual Basic에서 문자열을 붙이는 함수이다.

vbaVarCat 함수의 리턴 값으로 어떤 주소가 저장된다. 이 주소를 참조해보자.

0x0018F37C 주소의 값을 보면 문자열이 확인이 안된다. 이유는 Visual Basic에서 string 구조의 특성때문이다 Visual Basic의 string 구조는 다른 언어와 달리 문자열 주소 앞에 8bytes 값이 붙어 있다. 따라서 위와 같이 8bytes 뒤의 값인 0x005B9E8C 값이 진짜 주소다.

0x005B9E8C 주소를 참조하면 "REG-1300" 문자열을 확인할 수 있다.

그리고 이 문자열의 주소를 스택에 저장한 후, 다시 한 번 vbaVarCat 함수를 호출한다.

리턴되는 값은 위와 같다.

마찬가지로 진짜 문자열의 주소는 0x005BC154 값이다.

"REG-1300-CODE" 문자열 값을 확인할 수 있다.

그리고 문자열의 주소를 스택에 저장한 후 별도로 문자열의 값이 변경되거나 하지 않는다. 그리고 0x0040A101 주소로 점프하는데, 이 주소로 점프하면 [사진 2-6]의 메시지 박스가 뜬다. 따라서 Registration Code 값은 "REG-1300-CODE"임을 알 수 있다.

위와 같이 User Name은 2 이상의 임의의 값을 입력하고 Registration Code의 값은 "REG-1300-CODE" 문자열을 입력하면 성공 메시지 박스를 확인할 수 있다.

그리고 위와 같이 프로그램을 다시 실행하라는 창도 뜬다.

프로그램을 다시 실행하면 우측 하단의 문자열이 "REGISTERED" 값으로 바뀌었고 아이콘도 변경되었다.
세 번째 ReverseMe2 파일을 분석해야 한다....


그런데 Registration 칸에 값을 입력하면 [사진 3-2]처럼 오류가 난다. 내 실습 환경(윈도우 8)에서 정상적으로 실행이 안된다. 그래서 세 번째 파일은 생략하겠다...
'Wargame > Lena’s Reversing for Newbies' 카테고리의 다른 글
| Lena's Reversing for Newbie 12 Write-Up (0) | 2019.08.06 |
|---|---|
| Lena's Reversing for Newbie 11 Write-Up (0) | 2019.08.06 |
| Lena's Reversing for Newbie 09 Write-Up (0) | 2019.08.06 |
| Lena's Reversing for Newbie 08 Write-Up (0) | 2019.08.05 |
| Lena's Reversing for Newbie 07 Write-Up (0) | 2019.08.05 |