본문 바로가기

WarGame

2013 1st Whitehat Contest (제 1 회 화이트햇 콘테스트 팀 예선) - [Suspect Block]

2013 1st Whitehat Contest (제 1 회 화이트햇 콘테스트 팀 예선) - [Suspect Block] 

write-up by KimC & Jack2 


Prob)
 용의자 Anncc의 PC를 분석하던 도중 공범과 주고 받은 메일에 첨부된 특이한 파일을 발견하였다.
이 파일을 통해 Anncc는 공범과 범행을 위한 신호를 데이터 삭제를 통해 주고 받았다고 하는데...

 해당 파일에서 삭제된 데이터가 속한 페이지 인덱스 2개를 찾아 Anncc가 전달하고자 하는 날짜를 알아맞춰 보자.

     답 형식 : md5(MMDD) 소문자
      MM = First Deleted Page Index
      DD = Second Deleted Page Index
- 인증키 입력창에 브루트 포싱 공격으로 인증할 경우 무효 처리 -

Sol)



문제 파일을 다운로드 받은 뒤 압축 해제 한 결과 Suspect_Block.db 라는 하나의 파일이 담겨져 있다.
이 파일을 file 명령어를 통해 확인한 결과 SQLite database 파일 이라는 것을 알 수 있었다.

그래서 일단 SQLite Browser 를 이용해서 이 파일을 살펴보았다.


Data 를 살펴보던 중 urls 테이블에서 의심가는 부분이 발견 되었다.


index 번호가 정상적으로 진행되다가 120 다음 121이 아닌 122 가 나오는 것을 확인 할 수 있다.

즉, 문제 지문에서 

이 파일을 통해 Anncc는 공범과 범행을 위한 신호를 데이터 삭제를 통해 주고 받았다고 하는데...

데이터 삭제를 통해 주고 받은 부분이 바로 121 에 해당하는 것을 유추할 수 있다.

다음으로 SQLite Browser 에서는 보이지 않았지만 어딘가에 흔적이 있을 수 있다는 생각에 Hex editor 를 통해 database 를 살펴보았다.

살펴 본 결과
앞에서 확인한 index 120 과 122 에 해당하는 정보 (빨간색 네모 영역) 사이에 SQLite Browser 에서 보이지 않던
index 121 로 예상되는 (파란색 네모 영역) 정보가 담긴 것을 확인 할 수 있었다. 


해당 정보를 이용해서 Anncc 가 공범과 주고 받았다고 예상 할 수 있다.
문제 제목에서 약간의 힌트를 얻어 Suspect Block. 즉 의심되는 Block 이 이 부분 이라고 생각된다.

그런데 해당 database 를 살펴보던 중 keyword_search_terms 테이블에서 의심가는 부분이 발견되었다.

검색한 결과가 해당 테이블에 기록이 되어야 하는데 위에서 확인했던 'startuday night 소율' 이라는 검색어를 입력했기 때문에
'미쓰에이' 처럼 keyword_search_terms 에 기록이 되어야 하는데 존재하지 않는 것을 발견했다.

이 정보를 이용하여 SQLite Browser 에서 'startuday night 소율' 에 해당하는 
HEX 값(73 61 74 75 72 64 61 79 20 6E 69 67 68 74 20 EC 86 8C EC 9C A8)을 확인한 결과

SQLite Browser 상에서는 볼 수 없지만 hex 값은 존재하는 의심가는 Block 이 하나 더 있을 것을 확인 할 수 있었다.

1단계로 의심가는 블록 두 개를 찾은 것이다.


다음 나오는 문제 지문을 보면

해당 파일에서 삭제된 데이터가 속한 페이지 인덱스 2개를 찾아 Anncc가 전달하고자 하는 날짜를 알아맞춰 보자.

이라고 한다.

SQLite 에서 정의하고 있는 페이지 / 인덱스에 대해 살펴보았다.

페이지)


위 그림에서 보듯이 SQLite database file format 은 
동일한 크기의 여러 페이지로 나누어져 있고 각각의 페이지 크기는 2의 n 제곱크기 라는 사실을 알 수 있다.


다음으로 SQLite file format 의 헤더이다. 
16번째 오프셋의 2byte 가 의미 하는 부분이 나타나 있다. 페이지의 크기를 나타내 준다고 한다. 
위에서 SQLite file format은 여러개의 페이지를 가지고 있고 각각의 페이지는 동일한 크기를 가진다고 했다.

database 를 살펴 보면 16번째 오프셋(0x10) 에는 0x1000 이라는 값이 나타나있다. 
즉, 각각의 페이지 크기는 0x1000 으로 일정하다는 뜻이다.

의심가는 부분은 앞에서 미리 찾아 놓았기 때문에 해당 부분으로 이동해서




첫 번째 삭제된 데이터가 바로 0xA000 바로 전에 존재한다는 것을 알 수 있다.

페이지 구조는 

0x0 ~ 0xFFF (1Page)
0x1000 ~ 0x1FFF (2Page)
        .
        .
        .
0x9000 ~ 0x9FFF (10Page)

다음과 같고 첫 번째 삭제된 데이터 페이지 인덱스는 “10” 에 해당 한다.


다음으로 두 번째 삭제된 데이터의 index 를 찾아보도록 하자.

두 번째 삭제된 데이터를 찾았더니 해당 오프셋 0x1BC?? 이라는 것을 알 수 있다.
 0x1B000 ~ 0x1BFFF 블록은 28 페이지에 해당한다.

결론적으로 찾아낸 2개의 페이지 인덱스는 10 과 28 이 된다. 

마지막으로

      답 형식 : md5(MMDD) 소문자
      MM = First Deleted Page Index
      DD = Second Deleted Page Index

본 문제 답 형식에 맞게 md5(1028) 에 해당하는 값을 인증하여 점수를 획득했다.