본문 바로가기

리버싱

Reversing.kr Music Player 문제 풀이

주어지는 파일

압축을 푼 사진

 

ReadMe.txt 내용

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.

 

Music_Player.exe 실행 화면

뮤직 플레이어 실행 화면


목표

1분 미리듣기만 가능한 뮤직플레이어의 1분을 체크하는 몇몇 루틴을 회피하여 1분 이상 들을 수 있도록 하기!!


풀이

먼저, 재생할 음악 파일이 필요하다.

유튜브에서 무료로 음원을 받을 수 있었다.

음악을 재생하면 다음 사진과 같이 시간이 나오고 하단에서 바가 움직인다.

재생 화면

1분이 지나면 다음과 같이 메세지 박스가 뜬다.

1분 지났을 때

x32dbg에서 저 스트링을 찾아보자.

스트링 검색
코드에서의 모습

"1분 미리듣기만 가능합니다"라는 문자열이 있는 코드의 부분이다.

밑에 rtcMsgBox 함수도 보이는 것을 확인할 수도 있다.

1분이 지난다면 이 부분을 실행해 알림창이 뜨도록 할 것이다.

1분이 지나지 않았다면 이 부분은 실행되지 않을 것이다.

이 조건문을 나누는 분기가 어디서 이루어지는지 조금 위로 올라가본다.

분기문

eax와 0xEA60을 비교하고, 작으면 점프하도록 되어있다.

만약 점프가 이루어지지 않는다면 위에서 찾은 경고 메세지 박스가 뜨게 된다.

즉, 메세지 박스가 뜨지 않게 하기위해 이 점프가 무조건 이루어지도록 수정해준다.

첫번째 패치

첫번째 패치

jl을 jmp 명령으로 바꿔 무조건 분기가 일어나도록 하였다.

 

다시 실행해보자.

이런 경고 메세지 창이 뜬다.

이 경고 메세지 창이 뜰 때, x32dbg는 다음 코드에서 한 번 멈추게 된다.

중단점을 설정하지 않았는데도 한 번 멈춘다.

이 부분의 위로 조금 올라가 보면,

위 사진과 같이 kernelbase의 RaiseException 함수인 것을 알 수 있다.

 

이 메세지 창이 뜨지 않게 하려면 어떻게 해야 할까

처음에는 콜스택을 보면서 저 RaiseException을 호출한 다른 dll의 코드를 패치해 보았다.

노래를 1분 이상 재생시킬 수는 있었지만 플래그는 나오지 않았다.

music_player 코드 안에서 패치를 진행해야 하는 것 같다.

그럼, music_player를 조금 더 디버깅 해보자.

이 부분은 첫번째 패치에서 무조건 분기가 수행되었을 때, 점프하는 코드이다.

"1분 미리듣기만 가능합니다" 메세지 박스가 나오는 것이 "Run-time error" 메세지 박스가 나오는 것보다 우선 순위가 높기 때문에, 첫번째 패치 부분 이후에 RaiseException을 호출하는 부분이 있을 것이다.

 

시간이 59초일 때 저 위치에 중단점을 활성화 시켜서 디버깅해보았다.

디버깅을 해보니 vbaHresultCheckObj 함수가 수행되면 "Run-time error" 메세지 박스가 나오게 되는 것을 확인했다.

이 함수 위에 jge로 조건 점프문이 있는데, 1분이 안 됐을 때는 점프가 수행되고, 1분이 됐을 때(59초)부터는 점프가 수행되지 않아 vbaHresultCheckObj 함수가 실행된다.

즉, 저 함수가 수행되지 않도록 jge를 무조건 점프로 바꿔야 한다.

두번째 패치

두 번째 패치

jge를 jmp로 바꿔 무조건 분기가 일어나도록 하였다.

 

이제 프로그램을 실행해보면 1분이 지나도 음악이 재생되는 것을 볼 수 있다.

그리고 상단에 flag가 나온다.

풀이 완료