OutDoorFrog의 리버싱 이야기
Reversing.kr [Music Player] 본문
여러분들 새해 복 많이 받으세요~!
안녕하세요~ 블로그의 주인장 OutDoorFrog입니다.
2학년 2학기도 거의 끝나가고.. 방학도 머지 많아서 조금 긴 쉬는 시간을 가진 것 같습니다.
쉴 때는 확실하게 쉬고 공부할 때는 확실하게 공부하는 게 중요하죠!
Reversing.kr 올클을 향해 같이 나아가 봅시다.
1. 문제 구성
ReadMe.txt를 살펴보시면 문제에 대한 설명이 존재하고
Music_Player.exe의 실행에 필요한 msbvm60.dll도 동봉해서 넣어주신 것 같습니다.
(출제자님의 세심한 배려를 느낄 수 있습니다)
ReadMe.txt의 내용은 이 프로그램에서는 음악을 1분 동안만 들을 수 있게 제한이 걸려있고
1분 초과하여 들어야 하는데 1분 체크 루틴을 모두 우회하면 완벽한 플래그(?)를 볼 수 있다고
적혀있군요.
2. 파일 실행
적절한 UI 배치.. 무난한 MP3 Player인 것 같습니다.
1분 이상 직접 녹음해서 실행시켜 봅시다.
음 혹시 몰라서 Media Player로도 확인해봤습니다.
1분 제한은 이 프로그램에서만 걸리더군요.
(아 맞다 체크 루틴 우회하는 문제였지)
3. 리버싱
위의 사진을 보고 코더로써 생각하면 1분 이상 실행하고 있는지 판단하는 루틴이 프로그램에 존재할 것이라는 것을 유추할 수 있습니다.
1분이 지나면 메세지박스도 띄워지니까 메세지박스에 관련된 함수도 체크 루틴에 사용되어
있겠군요.
생각보다 문제가 빨리 풀어질 듯 합니다.
메세지박스 함수에 모두 bp를 걸어두고 프로그램을 돌려봅시다.
1분까지 음악이 재생된 후 BP에 걸렸습니다. IDA에서 한번 살펴봅시다.
CreateFunction 기능과 Rename 기능을 이용해서 감칠맛을 더해봤습니다.
난잡하니 디컴파일해서 봅시다.
보니 밀리세컨드를 기준으로 1분이 넘었는지 비교하는 것 같네요.
1분이 넘었다면 MsgBox를 통해 1분 미리듣기가 끝이 났다고 알려주네요.
1분 초과해서 들으면 답이 퍼펙트하게 보인다고 했으니까.. 패치를 해봅시다.
0xEA60 == 60000 입니다. 디버거에서 FFFF로 패치해줍시다.
실행쭉 돌려봅시다.
정답이 나왔... (ㅇㄴ)
런타임에러라... 꽤나 성가시네요.
콜스택을 살펴본 결과 4046B9에서 호출한 __vbaHresultCheckObj함수에서 에러를 띄우네요.
이 루틴을 계속 거쳐가면서 인자값이 잘못되진 않았는지 계속 확인하는 것 같습니다.
jmp로 무조건 넘어가도록 만들어서 요 루틴을 거치지 않도록 패치해봅시다.
후킹해야되나 생각도 해봤는데 다행이 패치가 먹히네요.
문제 풀면서 답이 은근히 끊겨나오는 경우가 많았습니다. ㅋㅋㅋㅋㅋ
후딱 다른 문제 풀어야겠네요.
'공부 > 사이트 문제 풀이' 카테고리의 다른 글
Reversing.Kr [HateIntel] (0) | 2019.01.03 |
---|---|
Reversing.Kr [Csharp] (0) | 2019.01.03 |
Reversing.kr [Easy_ELF] (0) | 2018.11.03 |
CodeEngn.com [Advanced] 2 (1) | 2018.09.22 |
CodeEngn.com [Advanced] 1 (2) | 2018.09.18 |