반응형

ReadMe.txt
0.00MB
msvbvm60.dll
1.32MB
Music_Player.exe
0.04MB
Music_Player_patched_half.exe
0.04MB
Music_Player_patched.exe
0.04MB

 


파악

 

This MP3 Player is limited to 1 minutes.
You have to play more than one minute.

There are exist several 1-minute-check-routine.
After bypassing every check routine, you will see the perfect flag.

 

문제 파일과 같이 들어있는 ReadMe 파일을 보면

 

"이 MP3 플레이어는 1분으로 제한되어 있고, 1분보다 더 재생되게 해야 한다."

"1분인지를 체크하는 루틴이 몇 개 존재하는데, 그것들을 모두 피해가게 만들면 완벽한 플래그를 볼 수 있다."

 

이라고 쓰여있다.

 

 

exeinfo에 문제 파일을 오려보니 Visual Basic으로 만들어진 프로그램이다.

 

Visual Basic에 관련된 기본적인 내용은 아래의 URL을 참고한다.

https://sean.tistory.com/205

 

 

프로그램을 실행하면 위와 같이 뜬다.

 

 

"열기" 버튼을 눌러 위와 같이 저장되어 있는 음원 파일을 직접 선택해도 되고

 

C:\Users\user\Music\Avicii - Waiting for love (한국어 가사해석번역).mp3

 

혹은 위와 같이 경로를 복사하여 붙여넣기 해도 된다.

(디버깅 할 때 알게되겠지만 파일을 선택하는 것보다 경로를 복붙하는 게 편하다.)

 

 

그리고 "플레이" 버튼을 누르면 정말 노래가 재생된다.

 

그 옆에는 "일시정지"와 "정지" 버튼이 있다.

 

 

그리고 정확히 1분이 돼면 위와 같이 "1분 미리듣기만 가능합니다"라는 메시지 박스가 뜬다.

 


분석

 

1분 이상 재생되도록 하기

 

위의 부분이 Visual Basic 프로그램의 EP 부분이다.

 

 

x32dbg의 문자열 검색 기능을 이용한다.

 

위의 화면과 같이 보일 것인데, 그 중 "1분 미리듣기만 가능합니다" 라는 문자열이 보인다.

 

해당 문자열을 더블 클릭하여 이동한다.

 

 

4045B2 주소에서 해당 문자열을 스택에 넣는다는 것을 알 수 있다.

 

그리고 가장 밑에 보면 4045D8 주소에서 rtcMsgBox 함수를 호출한다.

 

아마 4045D8에 있는 rtcMsgBox 호출 명령에서 "1분 미리듣기만 가능합니다" 메시지 박스가 띄워지는 것 같다.

 

4045D8 주소에 BP를 걸고 F9를 눌러 실행한다.

 

 

그러면 위의 창이 뜨게 되는데 Open 버튼을 누른다.

 

 

이 부분이 이 글 초반에 말했던 디버깅 하다가 알게될 거라는 부분이다.

 

위의 사진을 보면 옆에 Windows에 있는 폴더들이나 즐겨찾기 등이 보이지 않는다.

 

 

x32dbg를 보면 위와 같이 멈춰있는데 F9키를 눌러주면 파일을 열 수 있게 된다.

 

 

위와 같이 파일을 연 후 "플레이" 버튼을 눌러 재생한다.

(Ctrl + F2로 프로세스를 재실행 해줄 때마다 F9 키를 눌러 파일을 열어야 하므로, 파일의 경로를 복사해둔다.)

 

 

노래가 재생되다가 멈추게 되는데, 이때 x32dbg를 보면

(59초를 기다려도 되고, 초 아래에 있는 바를 움직여서 59초로 이동되게 해도 된다.)

 

 

위와 같이 BP를 걸어뒀던 4045D8 주소에서 멈춰있다.

 

 

F8 키를 누르면 위와 같이 메시지 박스가 뜨는 것을 확인할 수 있다.

 

 

4045D8 주소에서 스크롤을 위로 올리다 보면 위와 같이 40456B와 40457C 주소에서 조건 분기문이 보인다.

 

40456B 주소의 조건 분기는 eax에 있는 값과 EA60이라는 값을 비교하여 eax에 있는 값이 EA60값보다 작으면 4045FE 주소로 점프한다.

 

40457C 주소의 조건 분기는 eax에 있는 값과 ebx에 있는 값을 비교하여 eax에 있는 값이 더 크거나 같으면 404590 주소로 점프한다.

 

 

eax에 있는 값이 EA60보다 작을 때 점프하는 4045FE 주소는 위와 같은데, 4045D8 주소의 rtcMsgBox 함수를 지나친다.

 

EA60은 10진수로 60,000이고, 이는 60초를 의미하는 것이다.

 

 

그렇다면, 404563 주소에서 eax의 값이 항상 더 작도록 비교 대상 수를 최대치인 0xFFFF로 바꾸거나

 

 

위와 같이 40456B 주소의 jl 명령을 jmp로 바꾸어 무조건 분기하도록 한다.

 

 

패치(수정)한 내용을 저장한다.

 

 

패치한 파일을 실행하여 노래를 재생하면 1분이 지날 때 노래는 계속 재생되는데, 위와 같이 메시지 창이 뜬다.

 

런타임 에러만 없애주면 되겠다.

 

 

런타임 에러 메시지 창 없애기

 

원본 문제 파일이 아닌, 패치한 파일을 x32dbg에 올리면 관리자 모드로 실행할 것인지 물어보는데, 관리자 모드로 열어준다.

 

 

F9를 눌러 실행하고 노래를 재생한 뒤 1분 정도 위치로 이동시키면 노래가 멈추면서 위와 같이 76FB8462 주소에서 멈춘다.

(76FB8462 주소는 라이브러리의 주소이므로 환경마다 다를 수 있다.)

 

이 상태에서 F9 키를 눌러준다.

 

 

그러면 이어서 노래가 재생되고, 위와 같이 Run-time error 메시지 창이 뜨게 된다.

 

 

x32dbg의 호출 스택 탭에서 우클릭 후 "의심되는 호출 스택 프레임 표시" 기능을 누른다.

 

그러면 위와 같이 화면이 보인다.

 

 

다른 주소들은 라이브러리 내의 주소들이기 때문에 무시하고 40xxxx인 주소를 찾는다.

 

Run Time 메시지 창이 뜨는 부분이 어디로부터 호출된 것인지 찾는 것이다.

 

위의 사진에서와 같이 4046BF 주소가 있다.

 

해당 주소로 이동한다.

 

 

4046BF 주소에서 스크롤을 조금 위로 올려보면 4046AB 주소에 조건 분기가 있다.

 

런타임 에러 메시지가 뜬 이유는 4046B9 주소의 vbaHresultCheckObject 함수가 실행었기 때문에 뜨는 것이다.

(1분 전에는 4046AB 주소에서 4046BF 주소로 점프한다.)

 

 

그렇다면, 4046AB 주소의 JGE 명령을 jmp 명령으로 패치하고, 패치된 내용을 저장한다.

 


결과

 

 

두 가지 전부 패치된 파일을 실행하고 음원을 재생하면 위와 같이 1분이 넘게 재생되며, 타이틀 바에는 "LIstenCare" 이라는 답이 보인다.

 


인증

 

반응형

'전쟁 > reversing.kr' 카테고리의 다른 글

[reversing.kr] Replace  (0) 2023.12.17
[reversing.kr] Easy_UnpackMe  (0) 2023.06.22
[reversing.kr] Easy_KeygenMe  (0) 2023.06.22
[reversing.kr] Easy Crack  (0) 2023.06.21

+ Recent posts