본문 바로가기

취약점 분석/여러가지 구조 형식

ZIP Archive file format

반응형

[ ZIP Archive file format ]

https://en.wikipedia.org/wiki/Zip_(file_format)

https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html


[ 구성도 ]


ZIP Archive 포맷 구조는 위 그림과 같다.


[ Local file header + Data + Data descriptor ] 가 한 세트를 이루어 파일별로 쭉 쓰인다.

Data descriptor는 Optional한 헤더로 Flag의 3번째 비트(0x08자리)가 set 된 경우에만 추가되고, 보통은 header+data가 한 세트이다.


Central directory file header는 Local file header의 확장으로, Local file header와 1:1 매칭이 된다.

Central directory file header에는 Disk에서 Local file header 까지의 offset을 담고있어 이를 통해 해당 로컬파일세트와 연결된다. 


맨 마지막의 End of central directory record가 파일의 끝임을 알려준다.


1. [ Local file header ]


 4btyes

 Local file header 시그니처 0x04034b50 (고정) - 리틀엔디언 방식으로 읽는다.

 2bytes

 압축해제에 필요한 최소 버전  ex) 00 14 = 0x14 = 20(dec) => 2.0 version

 2btyes

 General purpose bit flag


 Bit 00: encrypted file
 Bit 01: compression option 
 Bit 02: compression option 
 Bit 03: data descriptor - set 될 시에만 Data Descriptor header가 추가됨.
 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

 2bytes

 압축 방법


 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 z
 98: PPMd version I, Rev 1 

 2bytes

 파일의 마지막 수정 시간


 Bits 00-04: seconds - 2로 나누어져 있음. *2 해야 실제 초.
 Bits 05-10: minute
 Bits 11-15: hour

 2bytes

 파일의 마지막 수정 날짜


 MS-DOS 표준 포맷
 Bits 00-04: day
 Bits 05-08: month
 Bits 09-15: years from 1980

 4bytes

 CRC-32

 'magic number' 0xdebb20e3 (little endian)와 CRC-32 알고리즘 수행 결과.

 4bytes

 압축된 상태의 크기

 4bytes

 압축 전의 원래 크기

 2bytes

 파일 이름 길이

 2bytes

 Extra field 길이

 n bytes

 파일 이름

 m bytes

 Extra field - 2bytes의 identifier와 그에 맞는 data길이로 구성됨.


 id 0x5455: extended timestamp, size: 9 bytes 
 id 0x7855: Info-ZIP UNIX, size: 4 bytes


이어서 Compressed Size 만큼 Data가 적히고, Data Descriptor가 Optional하게 추가된다.


2. [ Data Descriptor ]


 4bytes

 Data Descriptor 시그니처 0x08074b50 (고정)

 4bytes

 CRC-32

 4bytes

 Compressed size

 4bytes

 Uncompressed size


3. [ Central Directory file header ]


 4bytes

 Central Directory file header 시그니처 0x02014b50 (고정)

 2bytes

 만들어진 ZIP 버전,OS 정보


 upper byte: 
 0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)
 1 - Amiga 
 2 - OpenVMS
 3 - UNIX 
 4 - VM/CMS
 5 - Atari ST
 6 - OS/2 H.P.F.S.
 7 - Macintosh 
 8 - Z-System
 9 - CP/M 
 10 - Windows NTFS
 11 - MVS (OS/390 - Z/OS) 
 12 - VSE
 13 - Acorn Risc 
 14 - VFAT
 15 - alternate MVS 
 16 - BeOS
 17 - Tandem 
 18 - OS/400
 19 - OS/X (Darwin) 
 20 - 255: unused

 lower byte:
 zip specification version

 2bytes

 압축 해제시 필요한 최소 버전

 2bytes

 General purpose bit flag

 2bytes

 압축 방식

 2bytes

 마지막 수정 시간

 2bytes

 마지막 수정 날짜

 4bytes

 CRC-32

 4bytes

 압축된 상태의 크기

 4bytes

 압축 전의 크기

 2bytes

 파일 이름 길이

 2bytes

 Extra field 길이

 2bytes

 파일 코멘트 길이

 2bytes

 이 헤더와 매칭되는 파일이 담긴 디스크 번호

 2bytes

 Internal file attributes


 Bit 0: apparent ASCII/text file
 Bit 1: reserved
 Bit 2: control field records precede logical records
 Bits 3-16: unused

 4bytes

 External file attributes : host-system dependent

 4bytes

 매칭되는 파일이 담긴 디스크 시작에서 해당 파일의 Local file header까지의 Offset.

 n bytes

 파일 이름

 m bytes

 Extra field

 k bytes

 File comment



4. [ End of central directory record (EOCD) ]


 4bytes 

 EOCD 시그니처 0x06054B50 (고정)

 2bytes

 EOCD가 담긴 디스크 넘버

 2bytes

 첫번째 Central Directory가 담긴 디스크 넘버

 2bytes

 이 디스크에 담긴 Central Directory Record 개수 - 분할되지 않았다면 총 개수와 동일

 2bytes

 Central Directory Record 총 개수 

 4bytes

 Central Directory 총 크기 (btyes)

 4bytes

 첫번째 CD가 담긴 Disk의 시작에서부터 첫번째 CD까지의 Offset

 2bytes

 Comment 길이. (00 00이 아니라면 맨 뒤에 코맨트가 적힘)

 n bytes

 Comment.



스크린샷의 샘플은 여러개의 Disks로 나뉘지 않고 모두 하나에 담긴 파일이므로, 

1. 디스크 개수와, 첫 CD가 담긴 Disk 넘버가 모두 0.

2. 한 파일에 다 담겨있으므로 현재 Disk에 담긴 CD의 개수와 CD총개수 값이 동일.

3. CD들의 총 크기는 0x00005E15 bytes이고 첫CD의 주소는 0x003FA0DC이므로 더해주면 EOCD 헤더의 시작주소인 3FFEF1가 나옴.

4. 코멘트 길이는 0이므로 뒤에 따로 코멘트가 따라오지 않고 마무리 됨.

반응형

'취약점 분석 > 여러가지 구조 형식' 카테고리의 다른 글

EXIF Format  (0) 2018.11.28
JPEG 헤더 구조  (0) 2018.11.21
GZIP header format (.gz extention)  (0) 2018.01.10