abex` 4th crackme Write-Up
사용 도구: 올리디버거 2.01
abex` 4th crackme(이하 원본파일)를 풀어보자.
먼저 원본파일을 실행시키면 다음과 같은 메세지 박스가 뜬다.
Serial을 맞추는 프로그램이다. 그런데 어떤 값을 입력해봐도 'Registered' 버튼(이하 등록버튼)이 활성화가 되지 않았다.
디버깅을 통해 등록버튼을 활성화시키는 것인지 고정되어 있는 Serial을 입력하면 활성화가 되는 것인지는 모르겠다.
분석해보자.
올리디버거로 원본파일을 실행하면 위와 같은 코드가 나온다. Visual Basic(이하 VB)으로 만들어진 파일임을 알 수 있다.
abex` 2nd crackme에서 VB를 접해봤는데 VB 함수가 익숙하지 않아서 어려웠다..
먼저 메인함수를 찾기위해 사용되는 문자열들을 찾아봤다. 코드 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위 같은 창이 뜬다. 문자열이 두 번씩 보이는 것은 각각 초기화될 때와 사용될 때이다. 아랫 부분이 사용될 때의 문자열들이므로 아랫 부분의 문자열을 참조해보면 될 것 같다.
문자열들을 참조하면 어떤 루틴을 찾을 수 있다. 해당 루틴의 함수 프롤로그에 브레이크 포인트(이하 BP)를 설정하고 실행하면 위와 같이 Serial을 입력하라고 뜬다. 하지만 어떠한 값을 입력해도 등록버튼이 활성화되지 않고 디버깅할 수 없었다.
그리고 해당 루틴을 살펴보면 Serial을 맞췄을 때의 내용을 알려주는 코드들을 확인할 수 있었다. 하지만 실패했을 때의 문자열이나 별도의 코드가 없었다. 즉 Serial을 검사하는 루틴은 현재 루틴이 호출되기전에 수행되는 것이라고 생각하였다.
Serial을 검사하는 루틴을 찾기 위해 사용되는 문자열들을 살펴봤지만 특이한 것은 발견하지 못했다. 그래서 어떤 함수들이 사용되는지 확인했다. 코드 섹션에서 우클릭 - Search for - All intermodular calls 기능을 클릭하면 위와 같은 창을 볼 수 있다. 위의 창에서는 원본파일에서 사용되는 함수들을 확인할 수 있는데 40230D 주소에서 __vbaStrCmp 함수가 사용되는 것을 알 수 있다. __vbaStrCmp 함수가 어떤 기능을 하는지는 모르겠지만 함수 이름에 "Cmp"가 들어가고 C언어에서 strcmp() 함수가 문자열을 비교하는 것을 알고 있었기 때문에 __vbaStrCmp 함수가 문자열을 비교하는 함수라고 가정하였다.
__vbaStrCmp 함수가 사용되는 루틴 함수의 프롤로그에 BP를 설정하고 실행하자 Serial을 입력하는 창이 떴다. 그리고 문자를 입력하자 디버깅을 할 수 있었다.
그리고 __vbaStrCmp 함수를 호출하기 전에 인자 2개를 전달하는데 내가 입력한 값 "12"와 "2170425"를 전달한다. 원본파일을 여러번 실행해봤는데 해당 값 "2170425"는 고정된 값이었다.
원본 파일에 [사진 8]에서 확인한 값 "2170425"를 입력하면 등록버튼이 활성화되고 버튼을 클릭하면 위와 같이 메시지 박스가 뜨는 것을 볼 수 있다.
*후기
VB는 너무 어렵다.
'Wargame > abex` crackme' 카테고리의 다른 글
abex` 5th crackme Write-Up (0) | 2019.07.17 |
---|---|
abex` 3rd crackme Write-Up (0) | 2019.07.17 |
abex` 2nd crackme Write-Up (0) | 2019.07.17 |
abex` 1st crackme Write-Up (2) | 2019.07.13 |