해당 문제의 파일이며 "And do you know that sometimes music stores a hidden message?"라는 지문과 함께 주어지고, 아래의 사진은 윈도우 탐색기에서 기본적으로 제공해주는 파일 정보를 통해 해당 MP3 파일이 약 12초간 지속됨을 알 수 있다
[ * ] 해결 방향
해당 문제에서 주어진 지문을 통해 mp3 파일에 스테가노그래피가 적용 되어 있음을 알 수 있었고, 해당 파일이 가지는 바이너리 데이터에 대한 구조 분석을 통해 문제를 해결할 수 있을 것 같다
[ * ] 해결 과정
먼저 바이너리를 분석하기 전, 원래의 데이터가 가지는 정보는 무엇일까 해서 mp3 파일을 열어보았더니 무언가 성스러운 게임에서 나올 법한 BGM이 흘러나왔고 12초만 나오는게 아쉬워서 혹여나 음성 검색을 하면 나올까 해서 검색을 했더니 혼돈의 연대기라는 앨범명의 "리니지2 - 유니콘의 안식" 이라는 현재 문제 해결 과정에 전혀 쓸모 없는 정보를 얻을 수 있었고, 이렇게 까지 검색한 이유는 신비스럽기만 한 음악이 궁금했기에 찾아 본 것임과 동시에 해당 문제를 해결 하는 과정에서 아주 자그마한 지식이나 정보라도 알아 가고 싶은 마음에였다 ㅋ.ㅋ...
150점이라는 높지 않은 배점이기에 크게 어렵게 나온 것이 아니지 않을까 하는 생각을 하고 해당 데이터의 바이너리에서 아스키 값을 추출해낸다면 의미 있는 데이터가 나오지 않을까 하는 생각에 아래와 같이 "BinText"를 이용했지만 별 다른 데이터를 얻을 수 없었기에 접근 방향이 잘못되었음을 깨닫고 직접 분석하는 방향으로 생각을 돌렸다
해당 바이너리 데이터를 분석하기위해 Hex Editor로 파일을 열어 보았고 아래의 사진과 같다
해당 데이터의 헤더 부분에서 ID3라는 시그니쳐 값과 함께 RGB라는 문자와 해당 RGB 데이터로 추측되는 값을 확인할 수 있었고 익숙치 않은 데이터 포맷이었기에 검색을 해보았더니 ID3는 MP3 파일에서 사용하는 메타데이터 포맷으로, 음악의 제목, 음악가 이름 등의 음악 파일에 관련된 정보를 담으며 ID3는 "ID3v1"과 "ID3v2"라는 두 가지 버전이 있고 이들은 서로 호환성이 없으며 하나의 파일안에 동시에 존재할 수 있다는 정보를 얻을 수 있었다.
그리고 ID3는 두 버전 모두 TAG(이하 태그)라는 것을 사용하는데 이를 이용해서 프로그램이 쉽게 인식할 수 있게 하며, 해당 파일의 음악 제목, 음반 출시년도, 설명 등의 다양한 정보를 담을 수 있음을 알 수 있었고, 버전에 따라 태그의 위치가 달라지며 버전 별 특징을 간략히 정리하면 아래과 같다
- ID3v1 : 초기의 MP3 재생기는 태그가 파일의 첫 부분에 있을 경우 재생을 멈추거나 잡음이 튀는 등의 문제로 인해 태그를 파일의 끝에 128 바이트를 덧붙힘으로써 사용했는데, 태그가 128바이트로 정해져 있었으므로 담을 수 있는 정보의 한계가 있었다
- ID3v2 : 태그를 파일의 첫 부분에 큰 데이터 블록으로 삽입하며, 미디어 플레이어가 파일의 끝가지 읽어 들이기 전, 태그 정보를 얻을 수 있기 때문에 스트리밍 파일을 재생할 때 속도면에서 장점이 되며 128바이트의 한계를 벗어나 작사자, 지휘자, 매체 종류, BPM, 가사, 이미지, 볼륨, 잔향 설정, 암호화된 정보 등과 같은 다양한 정보를 넣을 수 있다
데이터를 붙여준 위의 값으로는 아스키 문자로도 표현이 되지 않을 뿐더러 의미 있는 데이터를 추출해 내기 어려웠으므로 진수 변환을 한다면 특정한 포맷을 가지는 바이너리 데이터가 되지 않을까 하는 생각에 16진수로 바꾸어 주었고 그 결과는 아래와 같다
78, 9C, CB, 8C, CF, 48, 2C, 49, 8D, 2F, 4D, 06, C2, F4, 44, 00, 2A, 9F, 05, B7
위 데이터가 가지는 의미는 무엇일까 하면서 생각하다 40자리라는 SHA-1 해시 함수의 특징을 가졌기에 문자를 해시화해 저장하는, "레인보우 테이블"을 제공하는 온라인 사이트를 이용해 복호화를 한다면 숨겨진 메시지의 원문이 나오지 않을까 싶어 복호화를 시도 해보았지만 테이블에 해당 해시 값이 존재하지 않았고, 다른 방향을 찾아 검색 도중 "78 9C"로 시작하는 시그니쳐의 확장자는 zlib라는 것과 zlib는 C에서 사용하는 데이터 압축 라이브러리의 일종이라는 것을 알게 되면서 해당 16진수 데이터는 zlib의 압축 데이터이며 압축을 풀어주게 되면 해당 문제에서 요구하는 hidden message를 얻을 수 있을 것 같아, 아래와 같이 해당 바이너리를 적어주고 test.zlib로 저장해 보았다
왜 열리지 않나 싶어 생각해보니 라이브러리의 일종인데 그게 압축 해제가 가능할리가 있나 싶었고 아직 미개함에서 벗어나기 위해 공부를 많이 해야겠다는 생각이 들었다 ㅋ.ㅋ 어쨌거나 zlib 파일의 압축의 해제를 어떻게 할까 찾아보다 파이썬에서 zlib 모듈과 해당 모듈에서 Decompress를 지원함을 알 수 있었고 샘플 코드를 찾아 본 뒤 작성해주었더니 mp3 파일에 숨겨진 메시지를 추출해 낼 수 있었다
Hidden Message = i_hate_ucucuga
참조 사이트
https://ko.wikipedia.org/wiki/ID3
https://en.wikipedia.org/wiki/ID3
https://ko.wikipedia.org/wiki/Zlib
http://quangntenemy.blogspot.kr/2014/01/phdays-ctf-quals-2014.html
https://stackoverflow.com/questions/1316357/zlib-decompression-in-python
http://hacktracking.blogspot.kr/2014/01/phdays-ctf-quals-2k14-mp3-me-1400-points.html
'Wargame' 카테고리의 다른 글
[DISK] Codegate 2013 > Forensic 100 (0) | 2017.07.19 |
---|---|
[DISK] NTFS & FAT32 백업 영역을 이용한 파티션 복구 (0) | 2017.07.07 |
[PACKET] ASIS 2013 - Forensic Final 300 (0) | 2017.07.06 |
[STEGANOGRAPHY] RuCTF Quals 2013 - Forensic 100 (0) | 2017.07.05 |
[Web Browser] Secuwave 2012 - Forensic 200 (0) | 2017.07.05 |