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 

추가적인 정보를 저장하기 위해 사용되는 항목이다. 

1.3.3 Local file header의 실제 예시

 [그림 3]은 한 Local file header의 실제 값들을 보여준다.

 [그림 4]는 [그림 3]에서 나타나는 헥사값을 Local file header의 항목에 맞춰서 나타낸 것이다. 

 

[그림 4]에서 나타낸 Local file header의 항목에 대한 정보를 나타낸 것이다. Local file header이기 때문에 Signature로 ‘504B0304h’를 가진다. 해당 PK Zip 파일을 추출할 때 필요한 버전이 20으로 나타나 있다. flag 항목의 비트 값이 0인 것으로 압축된 파일임을 알 수 있고 compress 항목을 통해 deflate 알고리즘을 사용해 압축된 파일이라는 것을 확인할 수 있었다. 시간 정보는 16:53:38, 날짜 정보는 03/15/2012이다. Crc-32-32값과 압축된 데이터의 크기, 압축되기 전 데이터의 크기를 항목에서 확인할 수 있으며 파일의 이름은 ‘SWM_Setup.exe’이고 길이는 13인 것을 알 수 있다. 또한 Extra field length가 0이므로 Extra는 존재하지 않았다. 

1.4 Data descriptor

 Data descriptor는 Local file header의 Flag 항목에 따라 나타난다. 이 경우 Local file header의 Crc-32-32와 compressed size 그리고 uncompressed size 항목은 0이 된다.

1.5 Archive decryption header

 Archive decryption header는 Central directory가 암호화 되었을 때 사용된다. 이 data 항목의 포맷은 앞선 압축된 데이터의 decryption header와 동일하다. 

1.6 Archive extra data 

 Archive extra data도 마찬가지로 Central directory가 암호화 되었을 때 사용된다. 이 data 항목의 크기는 End of Central directory 항목에 directory의 크기에 포함되어 있다. 구조는 아래와 같다.





+ Recent posts