Wargame/Reversing.kr

[Reversing.kr] Music Player

새하얀벚꽃 2019. 10. 10. 17:31

4번째 문제 Music Player 입니다.

이번에도 동일하게 문제의 의도를 모르니 ReadMe.txt 텍스트 파일을 읽어봅시다.

구글 번역기의 힘을 빌려 해당 텍스트를 번역한다면 다음과 같은 문장들로 해석 가능합니다.


이 MP3 플레이어는 1 분으로 제한됩니다.
1 분 이상 플레이해야합니다.

1분의 점검 루틴이 있습니다.
모든 점검 루틴을 우회하면 완벽한 플래그가 표시됩니다.


해석된 내용을 보아 이 뮤직 플레이어에는

재생 시간이 1분인지 체크하는 루틴에 의하여 1분까지만 재생을 제공하고

재생 시간을 체크하는 루틴을 우회한다면 문제의 플래그를 표시를 해준다는 것 같습니다.

 

음악 플레이어를 1분 이상 재생할 시

위와 같이 메시지 박스가 생성되며 음악 재생을 중단 당하게 되네요.

문제의 음악 플레이어는 비주얼 베이직으로 코딩하였기 때문에

비주얼 베이직에서 사용하는 메시지 박스 함수

MsgBox()에 브레이크 포인트를 걸고 메시지 박스 함수를 호출한 부근에 있는

인스트럭션을 분석하는 방식으로 문제를 풀이해보도록 하겠습니다.

 

msvbvm60.dll에 익스포트하고 있는 함수 rtcMsgBox()에 브레이크 포인트를 찍고

음악 플레이어를 재생 버튼을 누르며 1분 동안 대기해보면

설정했던 브레이크 포인트에 걸리게 됩니다.

리턴 주소에 있는 인스트럭션들을 확인해보면

0x00404563에 있는 CMP 인스트럭션으로

재생했던 시간 밀리 초와 60000 밀리 초와 비교하고 있습니다.

만약 재생했던 시간이 60000 밀리 초보다 클 경우 점프하지 않고

더 이상의 재생을 막는 루틴으로 실행 흐름이 넘어갑니다.

60000 밀리 초는 60초와 같기 때문에

재생 시간이 1분인지 체크하는 루틴이 확실하다는 느낌이 오네요.

0x0040456B에 있는 JL 인스트럭션을 다음과 같이 무조건 점프할 수 있게 JMP로 바꿔주도록 하겠습니다.

 

의도했던 데로 1분 이상 재생시켰지만

떠야 할 플래그는 뜨지 않고 런타임 에러가 뜨게 되네요.

콜스택을 확인해보면

0x004046B9에서 vbaHresultCheckObj() 함수를 호출하다가

런타임 에러가 발생한 것을 알 수 있습니다.

만약 런타임 에러가 발생하신다면

해당 함수의 호출을 방지하기 위해서 다음과 같이 NOP 패치를 해줍시다.

NOP 패치까지 완료하고 다시 1분 이상 재생을 시도하면

런타임 에러 없이 플래그가 음악 플레이어의 제목에 출력됨을 확인할 수 있습니다.

Music Player의 정답은 LIstenCare 입니다.