워게임/Reversing.kr

[Reversing.kr] Music Player 풀이

name2965 2022. 6. 29. 23:38
728x90

 

이번 문제에서 주어진 파일은 다음과 같습니다.

 

 

 

 

DLL 파일과 실행파일, readme.txt파일입니다.

 

먼저 readme.txt파일을 열어보면

 

 

 

 

문제 설명이 나와있는데, MP3 플레이어에 1분 제한이 있다고 합니다.

이 1분 제한 검사루틴을 우회하면 flag를 보여준다고 하네요

 

우선 exeinfope로 열어보면

 

 

 

32비트 기반에 별다른 패킹은 없다는것을 알수 있고, 비주얼 베이직으로 작성되어있다는것을 알수 있습니다.

 

우선 프로그램을 실행시켜보면

 

 

 

 

다음과 같은 구조로 만들어져있습니다. 우선 1분이 넘어가는 mp3파일을 구해서 열어보겠습니다.

 

 

열고나면 음악을 재생시킬수 있는데

 

 

59초가 되는 순간 다음과같은 메세지가 출력되면서 음악이 멈춥니다.

 

이제 본격적인 분석을 해보겠습니다.

 

 

 

저는 비주얼 베이직에 대해서 잘 모르기 때문에 인터넷으로 하나하나 찾아보면서 

분석을 진행해야했습니다.

 

익숙하지 않은 구조로 이루어져 있으므로 

우선 아까전에 봤었던 메세지박스를 출력하는 함수를 찾아보면

 

 

 

다음과 같은 함수가 보입니다.

 

이 함수를 사용하는 구문을 찾아보면

 

 

 

 

다음과 같은 구문들이 보입니다.

첫번째 구문은 방금본 점프문이고, 나머지 구문들은 이 함수를 사용하기위해 호출하는 구문들이므로

이 구문들중에서 1분 검사루틴에 쓰인 구문이 있을것이므로

breakpoint를 걸고나서 1분만 들을수있다고하는 메세지박스가 나올때 걸리는 구문이 있는곳이 바로 검사루틴 일것입니다.

 

 

이제 한번 분석을 해보면 다음과 같이 중단점에 걸리는 부분이 있는것을 알수 있습니다.

 

 

 

 

이 부분이 바로 1분 검사루틴일것이므로 여기서부터 분석을 해봐야 합니다.

 

 

하나하나 노가다로 동적분석을 하다가 알아낸 사실이 있습니다.

 

 

 

 

이 분기에서 만약 참이라면 계속해서 음악이 재생이 되고

거짓이라면 1분만 들을수 있다는 메세지가 나오는 곳으로 분기가 빠지게 됩니다.

 

첫번째 구문에서 eax로 어떤값을 복사하고 0xEA60과 값을 비교해서 구문을 나누는것으로 보이는데

첫번째 구문에 breakpoint를 걸고 음악을 재생시킨뒤 eax값을 확인해보면

 

 

다음과 같은 값이 복사되어있습니다.

이 값을 10진수로 표현하면 13442 입니다.

 

그런데 이때 재생되고있는 초를 확인해보면

 

 

13초 인것을 알수있습니다.

이것을 보고 어라 혹시? 라는 마음이 들어서 더 재생시켜봤는데

 

 

0xC46D는 10진수로 50285인데 50초까지 진행되고 있다는것을 보고 저는

이 값은 밀리세컨드 단위의 초라고 생각했고

분기문에서 비교한 값인 0xEA60은 60000이였고 분기를 나누는 opcode가 jl 이였으므로

 

이 분기문이 현재 시간이 60초 미만인지 확인하는 부분이라는것을 알아 냈습니다.

 

그럼 이 부분을 프로그램을 침해하지 않는 선에서 값을 크게 잡으면 해결될거라고 생각했습니다.

 

하지만 IDA에서는 코드패치가 원활하게 되지 않는 관계로 x32dbg에서 패치를 진행하겠습니다.

 

 

EA60대신 FFFF로 바꾸면 1분이상 음악을 듣게 할수 있을것입니다.

그런데 갑자기 다음과같은 오류가 나옵니다.

 

 

 

 

왜 이런 오류가 나온것인지 알아내기 위해 우선 어디서 멈췄는지 살펴봐야 합니다.

 

 

저는 도저히 이 오류가 왜 나오는것인지 알수가 없어서

어떻게 찾을수 있을까 생각해보다가 문득 든 생각이 있습니다.

 

이런 오류가 나타나면서 제대로 실행이 안되는 이유는

vbaHresultCheckobj 라는 함수를 어떤 부분에서 분기문으로 넘어가지 못하고

호출을 해버리는 바람에 프로그램에서 오류가 나오는것이 아닐까?

 

라는 생각이 들었습니다.

그래서 저는 이 함수를 호출하는 모든 어셈블리에 breakpoint를 설정하고 같은 오류를

다시한번 일으켜봤습니다.

 

 

그리고 나서 실행을 시켜보면, 저의 예상에 맞게 다음과같이 __vbaHresultCheckObj 함수에서

중단한것을 확인해볼수 있습니다.

 

 

 

이 부분을 보면 원래는 jge 분기에서 참이 나와서 이 부분으로 점프해야하지만

59초를 넘어서면 이 분기에서 거짓이 나오는것으로 보이기 때문에

여기있는 jge를 jmp로 바꿔서 무조건 점프하도록 수정해야합니다.

 

 

이 부분까지 수정한뒤 다시 재생해보면

메세지박스 이름에 성공적으로 플래그가 출력된것을 확인할수 있습니다.

 

 

728x90

'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] ImagePrc 풀이  (0) 2022.07.02
[Reversing.kr] Replace 풀이  (0) 2022.06.30
[Reversing.kr] Easy Unpack 풀이  (0) 2022.06.29
[Reversing.kr] Easy Keygen 풀이  (0) 2022.06.29
[Reversing.kr] Easy Crack 풀이  (0) 2022.06.29