1 PK Zip 파일 구조 분석
1.1 PK Zip 파일
PK Zip 파일 형식은 데이터를 압축해서 보관하기 위해 사용된다. 데이터 압축에는 여러 종류의 알고리즘이 있지만 현재는 deflate 알고리즘이 주로 쓰인다. PK Zip 파일은 파일 확장자로 ‘.Zip’이나 ‘.Zip’을 사용한다. 이번 ‘2016 포렌식챌린지’에서 대상이 된 Zip 파일은 PK Zip 파일이다. 이 후에 내용은 PK Zip 파일의 포맷과 메타데이터 정보에 대한 것이다.
1.2 PK Zip 파일의 전체 구조
전체적인 구조를 먼저 살펴보자. 각각의 PK Zip 파일은 아래의 [그림 1]을 따른다.
일련의 Local file descriptor들은 각각 한 개의 Local file header와 실제로 압축되거나 암호화된 데이터뿐만 아니라 조건적으로 Data descriptor를 갖는다. Data descriptor의 존재 여부는 Local file header의 플래그에 달려있다. Data descriptor에 뒤에는 Archive decryption header가 있다. 이 헤더는 PK Zip 파일의 버전이 6.2이거나 그보다 더 높을 때만 존재한다. Archive decryption header는 Central directory가 암호화되거나 암호화에 대한 특정 정보를 포함하고 있을 때만 나타난다. Archive extra data 항목은 모든 PK Zip 파일에서 보이지 않고 6.2버전 이상에서만 볼 수 있다. 해당 부분은 Central directory의 암호화나 압축에 대한 정보로 사용된다.
1.3 Local file header
1.3.1 Local file header의 구조
Local file header의 구조를 살펴보자.
[그림 2]는 Local file header의 전체적인 구조를 보여준다. 보이는 바와 같이 Local file header는 Signature, Version, Flags, Compression, Modified time, Modified date, Crc-32-32, Compressed size, Uncompressed size, file name length, Extra file length, file name, Extra 항목들로 구성되어 있다.
Signature부터 Extra length까지의 항목은 차지하는 값의 크기가 일정하게 정해져 있다. 하지만, file name, Extra 항목의 경우 앞선 file name length와 Extra field length에 따라서 Local file header의 길이가 변할 수 있다.
1.3.2 Local file header의 항목
항목 |
설명 |
Signature |
Local file header의 Signature이다. 이 항목은 항상 ‘504B0304h’값을 가진다. |
Version |
PK Zip 파일을 추출할 때 필요한 버전을 담고 있는 항목이다. |
Flags |
PK Zip 파일을 추출할 때 필요한 플래그를 담고 있는 항목이다. Bit 00: encrypted file Bit 01: compression option Bit 02: compression option Bit 03: Data descriptor Bit 04: enhanced deflation Bit 05: compressed patched data Bit 06: strong encryption Bit 07-10: unused Bit 11: language encoding Bit 12: reserved Bit 13: mask header values Bit 14-15: reserved |
Compression |
PK Zip 파일을 만들 때 사용된 압축 방식을 나타내는 항목이다. 00: no compression 01: shrunk 02: reduced with compression factor 1 03: reduced with compression factor 2 04: reduced with compression factor 3 05: reduced with compression factor 4 06: imploded 07: reserved 08: deflated 09: enhanced deflated 10: PKWare DCL imploded 11: reserved 12: compressed using BZip2 13: reserved 14: LZMA 15-17: reserved 18: compressed using IBM TERSE 19: IBM LZ77 98: PPMd version I, Rev 1 |
Modified time |
표준 MS-DOS 포맷을 따라 저장된 수정된 시간을 나타내는 항목이다. Bits 00-04: seconds divided by 2 Bits 05-10: minute Bits 11-15: hour |
Modified date |
표준 MS-DOS 포맷을 따라 저장된 수정된 날짜를 나타내는 항목이다. Bits 00-04: day Bits 05-08: month Bits 09-15: years from 1980 |
Crc-32-32 |
리틀 에디안 방식에 따라 ‘magic number’ DEBB20E3h를 가지고, Crc-32-32알고리즘을 사용해 압축된 데이터의 변조를 감지하는 체크섬을 나타내는 항목이다. |
Compressed size |
압축된 데이터의 크기를 나타내는 항목이다. 이 항목의 경우 archive가 PK Zip 파일 구조에 있을 경우 ‘FFFFFFFFh’를 따르고 실제 압축된 데이터의 길이는 extra 항목에 저장된다. |
Uncompressed size |
압축되기 전 데이터의 크기를 나타내는 항목이다. 이 항목의 경우 archive가 PK Zip 파일 구조에 있을 경우 ‘FFFFFFFFh’를 따르고 실제 압축된 데이터의 길이는 extra 항목에 저장된다. |
file name length |
아래의 항목인 file name의 길이를 나타내는 항목이다. 즉, 압축된 파일의 이름 길이를 나타낸다. |
Extra file length |
아래의 항목인 Extra 항목의 길이를 나타내는 항목이다. 즉, 추가적인 내용을 나타내는 부분의 길이를 나타낸다. |
file name |
파일이 존재하는 경로를 포함한 압축된 파일의 이름을 나타내는 항목이다. 모든 경로는 ‘/’를 포함하여 나타난다. |
Extra |
추가적인 정보를 저장하기 위해 사용되는 항목이다. |