Music Player

Timing check in a media player: the program has to believe the track played to the end.

2026.08.18 Reversing original post

취미로 푸는 워게임 풀이기 때문에, 전문성이나 깊이 있는 이해도가 떨어질 수 있음. 개인 기록용으로 올리는 거기 때문에, 전문성을 원하는 거면 다른 보안 블로그의 풀이를 찾아보기 바람.

파일은 두 가지가 있다. 하나는 실행 파일이고 하나는 워게임의 instruction 을 담은 노트이다.

Figure 1

Reversing.kr 에서 Music Player 문제 파일을 다운로드한 뒤, x32dbg 에서 실행 파일을 연다. 좌측 Symbols(또는 Modules/Functions) 창을 확인하면 main(또는 엔트리포인트 → main 으로 이어지는 함수)과 여러 DLL 함수들이 보인다. 이 문제는 뮤직플레이어가 1분 이상 작동될 수 있게 하는 것이기 때문에, main(혹은 main 으로 추정되는 함수)을 더블클릭하여 디스어셈블리 뷰로 이동한다.

Figure 2

Strings(A2)를 열고 프로그램 실행 시 화면에 출력될 것 같은 문자열을 찾아 들어가면, 뮤직플레이어가 1분 이상 초과했을 때 나오는 문구인 “1분 미리듣기만 가능합니다” 가 나온다. 거기서부터 코드를 디버깅해보자.

Figure 3

코드는 jl 문 속에 있다. 그것은 jl 문이 항상 참이 되면 1분 미리듣기를 넘어갈 수 있다는 것을 뜻한다. 스페이스 바를 눌러 어셈블리어의 jl 문을 jmp 문으로 바꾸자.

그 후 계속 F9 을 눌러 미리 준비한 음악을 고르면 음악을 들을 수 있다. 확실히 jl 문을 바꾼 후 “1분 미리듣기만 가능합니다” 라는 문구는 안 나오지만, 대신 런타임 에러가 나온다.

Figure 4

런타임 에러가 나오게 하는 함수를 찾아내기 위해, 다시 한번 콜스택에 집중하며 반복한다. 코드는 런타임 에러가 발생했을 때 가장 먼저 004046BF 를 호출하고, 우리는 그 주소를 따라간다. 그리고 그곳에 있는 어셈블리어를 다시 한번 디버깅한다.

Figure 5

이곳에서 vbaHresultCheckObj 을 서치해보면, 그게 런타임 에러를 부르는 함수라는 것을 알 수 있다. vbaHresultCheckObj 에 접근 못하게 위 조건문을 무조건 참(TRUE)으로 바꿔준다.

Figure 6

다시 그 상태에서 한번 더 코드를 F9 으로 런한다. 1분이 넘어도 노래는 계속 재생되고, 플래그가 1분 후 제목에 표시된다.

Figure 7

플래그는 ListenCare 이다.