
문제 제목만 보면 재밌어 보일것 같다.

1분 미리듣기를 우회하면 flag를 얻을수 있다고 한다.

아무 mp3파일을 들고와서 재생을 해보면 1분이 되었을때 미리듣기만 가능하다는 메시지가 나온다.

코드가 난잡하다.(알고보니 이유가 있었는데...) 당황하지말고 start 부분을 찾아보았다.

문제에서 준 dll 파일을 로드하고 dll에 있는 ThunRTMain 부분으로 점프한다.

본격적으로 대화창을 생성하는 부분인듯 하다.
미리듣기 메시지가 담겨있는 부분을 한번 찾아보자
.text:00401851 aMp3Player db 'MP3_Player',0
문자열을 참조한 부분을 도저히 찾을 수 없어서 왜그런지 알아봤더니 이 프로그램의 작성 언어인 비쥬얼 베이직을 IDA에서 인식하지 못하기 때문이었다. X32디버거를 이용해서 찾아보았다.

다이알로그 메시지가 들어간 부분을 찾았다. 함수의 시작점이 어디인지 살펴보자

빨간 화살표부터 "1분 미리듣기만 가능합니다" 메시지가 출력되는 부분이다.
그리고 이 부분을 찾아내다가 한가지 더 발견한 부분이 있다.

1초가 지날때마다 이쪽 부분이 계속 호출된다. 1초가 지날때마다 1분이 지났는지 안지났는지 계속 비교하는것 같다.
이제 1분제한을 우회하는 방법을 하나씩 찾아보자

1분이 되었을 시점에서만 저기서 점프를 하지 않는다. Sign 플래그를 1로 바꿔서 1분이 지난 시점에서도 저 분기문을 건너띄어보았다.
음악이 계속 나오긴 하지만 런타임 오류를 뿜어내었다.
더 자세한 분석이 필요할것같다.

비교대상에 대해 더 자세히 알아보기 위해 eax값의 변화를 살펴보았다.
ebp-A4에 있던 값이 eax에 저장되는데, 처음 1초 실행했을때 들어있는 값이 972였다. 이후에도 900 후반에서 달라졌다.
1초는 1000밀리초이니 밀리초 값이 저장될거라고 가정을 해봤다.
eax값이 0xEA60과 비교되는데, 10진수로 바꾸면 60000이다. 60000밀리초는 1분이므로 eax에 저장된 값이 음악을 플레이한 시간의 밀리초라고 확신할 수 있었다.
그런데 저 EA60을 바꾸었더니 이번에도 런타임 오류가 떴다..
대체 어디서 오류가 발생하는걸까?

이 함수에서 계속 오류가 발생한다. 이 함수를 건너띄면 무슨일이 벌어질까?
일단 오류를 뿜어내지는 않는다. 한번 브레이크 포인트를 풀고 살펴보자

갑자기 플래그가 공개되었다. 아까 값을 FFFF로 설정해서 약 1분 5초가 되는 시점에서 미리듣기는 1분이라는 메시지가 표시되긴 했지만 일단 1분 우회에는 성공했다.
여러가지 루틴이 있다는데.. 오류해결이 루틴 중 하나였다는게 신기했다.
비쥬얼 베이직을 전혀 몰라도 해결이 가능한듯 했다.

IDA의 편의기능에 의존하지 않고도 분석하는 연습을 조금씩 해나가야겠다..
'정보보안' 카테고리의 다른 글
| [문제해결] Reversing.kr Easy Keygen 해결과정 (0) | 2022.02.01 |
|---|---|
| [문제해결] HackCTF RandomKey 해결과정 (0) | 2022.01.28 |
| [문제해결] HackCTF Poet 해결과정 (0) | 2022.01.22 |
| [문제해결] HackCTF RTL_World 해결과정 (0) | 2022.01.22 |
| [문제해결] HackCTF yes or no 해결과정 (0) | 2022.01.21 |