Reversing.kr MusicPlayer

Reversing/리버싱 문제풀이

2015. 10. 6. 18:34





1분 미리듣기만 되는 뮤직 플레이어이다.

1분마다 체크를 하는 루틴이 존재하고 1분이상 들을수 있게하면 flag가 뜬다고 되있다.



1분을 다들으면 이런 메시지 창이뜬다.










우선 함수호출중에 메시지창을 띄우는 함수 모두 브레이크를 걸었다.

그리고 실행을 시킨뒤 1분뒤로 스크롤바를 드래그 해서 메시지 창이 뜰때의 브레이크잡히는 곳을 분석햇다.


메시지박스를 띄우는 부분


메시지 띄우는 곳으로 분기하는 부분



더 위쪽을 보니 함수처럼 특정 부분에서 분기하여 실행되는 것을 알게됬다.



거슬러 올라가니 이렇게 다양한 경우가 있음을 알 수 있었다.

저기 있는 JMP문을 다 브레이크 걸고 어떤 경우에어디로 가는지 알아보았다.

실행을 시키는 순간부터 계속 004023C5와 00403370에 번갈아가면서 브레이크가 걸렸다.

4023C5는 1분미리듣기라는 메시지창이 뜨는 함수가 실행되는 주소이다.

이렇게 JMP가 많은 이유는 아마 아무것도 음악파일을넣지 않았을 경우 실행했을때, 스크롤을 움직였을때 등등 여러 경우에 대비한 것 같다

따라서 여기 어딘가로 점프하면 FLAG값이 출력될거라는 느낌이 왔다.

우선 1분이라는 수와 비교하는 부분을 찾아야한다.


이 분기문을 보면 EAX가 0EA60보다 작으면 계속 점프를 하며 노래가 재생되는 부분이다.

EA60(10진수 60000) 보다 크게되면 분기를 하지않고 진행이되 1분미리듣기만 된다는 메시지가 뜬다.

따라서 이 EA60을 크게 해야한다.


이 수를 크게 수정 한 다음 진행을 하면 



이런 에러가 뜬다.


이 에러가 뜨는 곳을 알아보기 위해 스택에서 이 예외를 호출한 함수까지의 스택구조를 살펴 보았다.


스택구조를 보고 이 함수에서 예외가 발생했다는 걸 알고 호출시 스택에 저장한 리턴주소로 이동하여 살펴보았다.


이 함수는 위에 분기문이 있는데 저 부분을 jmp해버리면 이 함수를 통하지 않기때문에 예외가 발생하지 않는다.






따라서 EA60과 비교하는 부분을 좀 더 크게 수정하고 

예외가 발생하는 곳을 통과 시키면 아래와 같은 성공 창이 뜨고 위에 flag가 나온다.