[Reversing.kr] Music Player

#REVERSING

Reversing.kr의 Music Player 문제풀이


Music Player문제인데 이번엔 GUI 환경이다.

동봉된 ReadMe의 설명은 아래와 같다.

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.

MP3 플레이어인데 1분 미리듣기만 가능하다. 1분을 체크하는 부분이 존재하는데 이곳들을 우회해서 1분 넘게 듣도록 하는 것이 목표이다.

mp3_player 실제로 작동하면 1분이 넘어갈 경우 메세지 박스가 출력되면서 음악 감상이 멈춘다. 1-minute

x32dbg문자열 찾기 기능으로 1분 미리듣기만 가능합니다. 부분을 찾고 주변을 살피면 의심스러운 부분이 나온다.

original_1_minute_cmp

cmp eax, EA60이 나오는데 EA60을 10진수로 표현하면 60000이다. 보통 프로그래밍에서 1초를 ms로 계산하여 1000으로 표현하는데 1분이면 딱 60000이다.

따라서 40456B의 분기문을 아래와 같이 무조건 분기로 패치하면 1분 검증 분기를 우회할 수 있다. patch_1_minute_cmp

패치를 완료하고 다시 플레이어로 음악을 재생하면 1분이 넘어가는 시점에서 음악은 계속 나오지만 런타임 에러가 발생한다. runtime_error

어느 부분에서 런타임 에러가 발생했는지 확인하기 위해서 호출 스택창을 여는데. 여기서 조금 헤맸다.

호출 스택창에서 우클릭하여 의심 되는 호출 스택 프레임 표시를 활성화하여야 정상적으로 진행이 가능하다.

call_stack

최근 스택에서 70번지대 말고 40번지대가 의심되는데 도착이 4046BF이다. 해당 부분으로 이동하면 2_check

4046B9의 함수 호출에서 런타임 에러까지 이어졌다는 것을 의심할 수 있으므로 위의 분기문을 아래와 같이 무조건 분기로 패치하면 끝이다.

2_check_patch

2번의 패치를 끝으로 다시 플레이어로 음악을 재생하면 1분이 넘어가는 시점 Flag를 확인할 수 있었다.

success

정답은 LIstenCare이었다.