Music Player
Timing check in a media player: the program has to believe the track played to the end.
** 취미로 푸는 워게임 풀이기 때문에, 전문성이나 깊이있는 이해도가 떨어 질수있음. 개인기록용으로 올리는거기 때문 에, 전문성을 원하는거면 다른 보안 블로그의 풀이를 찾아보기 바람.
파일은 두가지가 있다. 하나는 실행 파일이고 하나는 워게임의 instruction 을 담은 노트이다.

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

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

코드는 jl 문에 속에 있다. 그것은 jl 문이 항상 참이 되면 1분 미리듣기를 넘어갈수있다는것을 뜻한다. 스페이스 바를 눌러 어셈블리어의 jl 문을 jmp 문으로 바꾸자. 그후 계속 f9 을 눌러 미리 준비한 음악을 고르면 점점 음악을 들을수있다. 확실 히 jl 문을 바꾼후 “1 분 미리듣기만 가능합니다” 라는 문구는 안나오지만, 대신 런타임 에러가 나온다.

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

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

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

플래그는 ListenCare 이다.