[reversing.kr] Music Player
Rev/reversing.kr

[reversing.kr] Music Player

반응형
File Format : WINDOWS 32-bit

파일 내에 README.txt를 살펴보면 음악 파일의 길이가 1분인지 체크하는 루틴이 있다고 한다.

모든 체크 루틴을 우회하면 플레그를 볼 수 있다고 한다.

 

🧭 Execute & Analyze


실행하고 아무 음악이나 넣은 상태에서 1분까지 가면 다음과 같은 창이 뜬다.

처음 시작을 저 창이 뜨지 않게 우회하는 것으로 시작해보자.

 

Step 1. Remove the pop-up window

사용하는 string 중에 "1분 미리듣기"가 포함된 것을 찾고 근처 어셈블리어로 가본다.

rtcMsgBox 함수가 해당 창을 띄워주고 있다는 걸 알 수 있다.

이제 해당 분기로 점프하는 곳이 어딘지 찾아야 한다.

조금 위를 보다 보면...

하이라이트 된 부분(00404563)에 cmp를 하고 jl로 점프하는 곳이 존재한다.

0xEA60은 decimal로 60000인데 밀리 초로 계산하면 60초, 즉 1분이다.

중단점 걸어놓고 계속 F9 눌러보면 알겠지만 매순간마다 저기서 걸려서 체크한다.

현재 시점에서의 재생 시간을 비교하는 것이라 추측했다.

더보기

현재 시점의 재생 시간 비교가 맞을 것 같은 이유는 노가다로 내부 루틴 검사하면

mciCommand 함수에서 seek 모드로 계속 시점 얻어와서 리턴하는 것 같은 모습을 보인다.

 

그래서 저 곳의 비교문의 숫자를 60000보다 크게 패치해서 다시 실행해준다.

이렇게 해서 다시 돌리면 더 이상 "1분 이상" 메시지 창은 뜨지 않지만 한 가지 문제점이 더 생긴다.

음악은 1분이 넘어도 계속해서 재생이 되고 있지만 이 에러창 때문에 플래그를 확인하지 못한다.

이 에러를 없애기 위해서 어디에서 이런 일이 벌어졌는지 콜스택을 확인해서 해결하고자 한다.

 

x64dbg를 아직 덜 만진 상태에서 보면 이렇게 정상적인 콜 스택만 확인 가능하다.

이래서는 어디에서 에러를 토해냈는지 알 수가 없다.

x64dbg doc 보니까 [우클릭 > 의심되는 호출 스택 프레임을 표시] 설정해주면 이상한 것까지 다 보여준다고 해서 설정하고 다시 보면,,,

하이라이트 된 부분에서 유일한 music_player_v2 (v2는 패치하고서 저장할 때 이름 저렇게 줬다) 콜 스택이 보인다.

해당 주소로 가보면 다음과 같다.

반환될 값이 004046BF니 그 전 명령어인 004046B9에서 에러를 호출했음을 알 수 있다.

결국 음악 길이 검사하다가 jge를 통해 점프하지 못하고 들어가게 된 것이니 패치를 통해 해당 조건 검사와는 무관하게 해당 라인을 통과하게 만들어준다.

jge -> jmp로 패치해서 해당 실행파일을 실행시켜 1분이 넘었을 때의 창의 변화를 본다.

 

패스워드가 나오면서 문제가 끝나게 된다.

 

얻은 교훈

1. 목표로 삼은 루틴으로 점프하게 하는 곳을 자세히 보고 헷갈린다 싶음 직접 브레이크 포인트 넣으면서 검증해라.

2. 콜 스택에서 에러 부분이 나는 곳을 잘 살펴보자.

반응형