Forensic

[Forensic] zip 파일 구조 정리

Papya_j 2024. 7. 24. 16:20

zip 파일 구조에 대한 분석

 

zip파일 이란? 하나 이상의 파일을 하나로 합쳐주는 것, 파일의 크기를 줄여 보다 쉽게 전송 및 저장이 가능함.

 

https://blog.forensicresearch.kr/3

위의 그림은 zip 파일의 간략한 구조로 3개의 파일이 하나로 압축되었을 때의 구조이다. 대략적인 형태를 나타내었고 이를 통해 어떤 구조인지 확인할 수 있다. 자세한 분석을 해보겠다.

 

 

https://blog.forensicresearch.kr/3

위 사진은 zip파일이 하나일 때를 나타낸 것이다.

Local File header와 File name, File data가 존재하는 것을 볼 수 있다.

Cnetral Directory가 존재하고 File name이 존재하는 것을 확인할 수 있다.

마지막으로 End of Central Directory Record 와 Zip file Comment가 존재하는 것을 확인할 수 있다.

 

표시된 색상 중 주황색은 크기가 고정되어 있으며, 초록색으로 나타낸 곳은 가변적인 곳이다.

더 자세히 살펴보겠다.

 

1. Local File Header(30byte: 가변값 제외)

     local_file header signature   – 4 bytes – (0x04034b50) : 고유 값 (시그니쳐로 시작 부분을 알 수 있음)
     version needed to extract     – 2 bytes : unzip을 하기 위한 버전
     general purpose bit flag      – 2 bytes : [*flag 부분 참고]
     compression method            – 2 bytes : 압축 방법. [*압축 부분 참고]
     last mod file time            – 2 bytes : 파일 수정 시간
     last mod file date            – 2 bytes : 파일 수정 날짜 [*날짜 계산 부분 참고]
     crc-32                        – 4 bytes : crc-32 값 가진
     compressed size               – 4 bytes : 압축 크기
     uncompressed size             – 4 bytes : 원본 크기
     file name length              – 2 bytes : 파일 이름의 길이
     extra field length            – 2 bytes : 추가 필드의 길이
     file name (variable size)
     extra field (variable size)

 

* general purpose bit flag (0x06~07)

└ 0x00 : encrypted file

└ 0x01 : compression option

└ 0x02 : compression option

└ 0x03 : data descriptor

└ 0x04 : enhanced deflation

└ 0x05 : compressed patched data

└ 0x06 : strong encryption

└ 0x07-0x10 : unused

└ 0x11 : language encoding

└ 0x12 : reserved

└ 0x13 : mask header values

└ 0x14-0x15 : reserved

 

* compression method (0x08~09)

└ 0x00 : no compression

└ 0x01 : shrunk

└ 0x02 : reduced with compression factor 1

└ 0x03 : reduced with compression factor 2

└ 0x04 : reduced with compression factor 3

└ 0x05 : reduced with compression factor 4

└ 0x06 : imploded

└ 0x07 : reserved

└ 0x08 : deflated

└ 0x09 : enhanced deflated

└ 0x0A : PKWare DCL imploded

└ 0x0B : reserved

└ 0x0C : compressed using BZIP2

└ 0x0D : reserved

└ 0x0E : LZMA

└ 0x0F-0x11 : reserved

└ 0x12 : compressed using IBM TERSE

└ 0x13 : IBM LZ77 z

└ 0x62 : PPMd version I, Rev 1

 

* 날짜 계산

밑에서 자세히 살펴볼 Hex 값 중 일부

1. 시간 계산

0x0A ~ 0B : 시간

little endian : 0x7BA4 (2진수 변환시 0111 1011 1010 0100) -> 5비트(시간) / 6비트(분) / 5비트(초) 로 끊기

- 시 : 01111 -> 15시

- 분 : 011101 -> 29분
- 초 : 00100 -> 4 (초는 x2 해줘야 함 So, 8초)

따라서 시간 : 15시 29분 8초

 

2. 날짜 계산

0x0C~0D : 날짜

little endian : 0x58F8 (2진수 변환시 0101 1000 1111 1000) -> 7비트(연도) / 4비트(월) / 5비트(일) 로 끊기

- 연도 : 0101100 -> 44년

- 월 : 0111 -> 7월

- 일 : 11000 -> 24일

년도가 조금 이상한 것을 알 수 있다. zip파일에서 날짜 계산 시 년도에는 기본 -1980년 값이 적용되어 나오기 때문에 실제론 1980을 더해야 한다.

따라서 날짜 : 2024년 7월 24일

 

 

2. Central File Header(46byte: 가변값 제외)

     central file header signature   – 4 bytes – (0x02014b50) : 고유 값 (시그니쳐로 시작 부분을 알 수 있음)
     version made by                 – 2 bytes : 압축 버전 정보 [* 압축 버전 정보 참고]
     version needed to extract       – 2 bytes : 압축 해제시 필요한 정보
     general purpose bit flag        – 2 bytes : flag [* flag 참고]
     compression method              – 2 bytes : 압축 방법 [* 압축 방법 참고]
     last mod file time              – 2 bytes : 파일 수정 시간
     last mod file date              – 2 bytes : 파일 수정 날짜
     crc-32                          – 4 bytes : crc-32
     compressed size                 – 4 bytes : 압축 크기
     uncompressed size               – 4 bytes : 원본 크기
     file name length                – 2 bytes : 파일 이름 길이
     extra field length              – 2 bytes : 추가 필드 길이
     file comment length             – 2 bytes : 파일 코맨트 길이
     disk number start               – 2 bytes : 파일이 존재하는 디스크 번호
     internal file attributes        – 2 bytes : 내부 속성 값 [* 내부 속성값 참고]
     external file attributes        – 4 bytes : 추가 파일 속성 값
     relative offset of local header - 4 bytes : local header의 시작 offset
     file name (variable size)
     extra field (variable size)
     file comment (variable size)

 

* 압축 버전 정보  

└ 0x00 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)

└ 0x01 - Amiga

└ 0x02 - OpenVMS

└ 0x03 - UNIX

└ 0x04 - VM/CMS

└ 0x05 - Atari ST

└ 0x06 - OS/2 H.P.F.S.

└ 0x07 - Macintosh

└ 0x08 - Z-System

└ 0x09 - CP/M

└ 0x0A - Windows NTFS

└ 0x0B - MVS (OS/390 - Z/OS)

└ 0x0C - VSE

└ 0x0D - Acorn Risc

└ 0x0E - VFAT

└ 0x0F - alternate MVS

└ 0x10 - BeOS

└ 0x11 - Tandem

└ 0x12 - OS/400

└ 0x13 - OS/X (Darwin)

└ 0x24 - 0xFF : unused

 

* flag 정보

└ 0x00 : encrypted file

└ 0x01 : compression option

└ 0x02 : compression option

└ 0x03 : data descriptor

└ 0x04 : enhanced deflation

└ 0x05 : compressed patched data

└ 0x06 : strong encryption

└ 0x07-0x0A : unused

└ 0x0B : language encoding

└ 0x0C : reserved

└ 0x0D : mask header values

└ 0x0E-0x0F : reserved

 

* 압축 방법 참고

└ 0x00 : no compression

└ 0x01 : shrunk

└ 0x02 : reduced with compression factor 1

└ 0x03 : reduced with compression factor 2

└ 0x04 : reduced with compression factor 3

└ 0x05 : reduced with compression factor 4

└ 0x06 : imploded

└ 0x07 : reserved

└ 0x08 : deflated

└ 0x09 : enhanced deflated

└ 0x0A : PKWare DCL imploded

└ 0x0B : reserved

└ 0x0C : compressed using BZIP2

└ 0x0D : reserved

└ 0x0E : LZMA

└ 0x0F-0x11 : reserved

└ 0x12 : compressed using IBM TERSE

└ 0x13 : IBM LZ77 z

└ 0x62 : PPMd version I, Rev 1

 

*내부 속성 값

└ 0x00 : Apparent ASCII/text file

└ 0x01 : Reserved

└ 0x02 : Control Field Records Precede Logical Records

└ 0x03~0x10 : Unused

 

 

 

3. End Header(22byte: comment 제외)

     end of central dir signature      – 4 bytes – (0x06054b50) : 고유값 (시작 부분 알 수 있음)
     number of this disk               – 2 bytes : 파일이 존재하는 디스크 번호
     number of the disk with the start of the central directory       – 2 bytes  : central directory가 시작되는 disk의 개수 
     total number of entries in the central directory on this disk    – 2 bytes : 해당 disk의 central directory 총 개수
     total number of entries in the central directory                 – 2 bytes : central directory의 총 개수
     size of the central directory     – 4 bytes : central directory의 크기
     offset of start of central directory with respect to the starting disk number  – 4 bytes :  central directory의 시작 offset
     .ZIP file comment length          – 2 bytes : file comment 길이
     .ZIP file comment (variable size)


 

 

 

 

[예시]

자세히 살펴보겠다.

위와 같은 파일을 만든 후 zip 파일로 압축시켰다. 

HxD tool을 사용하여 zipfile.zip을 확인한 결과 위와 같이 나오는 것을 알 수 있다.

 

먼저 Local file header, Central file header, End header를 찾는다

- 0x04034b50을 고유값으로 가지는 0x00~0x03을 확인할 수 있고 이 부분이 Local file header이다.

- 0x02014b50을 고유값으로 가지는 0x32~0x35를 확인할 수 있고 이 부분이 Central file header이다.

- 0x06054b50을 고유값으로 가지는 0x8F~0x92를 확인할 수 있고 이 부분이 End header이다.

 

나머지는 각각의 바이트에 맞춰서 원하는 정보들을 찾고 구조를 분석할 수 있다.

 

 

참고 블로그가 너무 잘 되어 있어서 큰 도움을 받았던 것 같다. 이해가 안되거나 더 자세한 정보가 필요하면 반드시 방문해보는게 좋을 것 같다.

 

참고

https://blog.forensicresearch.kr/3

http://downrg.com/2009/07/31/zip-%EC%95%95%EC%B6%95%ED%8C%8C%EC%9D%BC-header-%EA%B5%AC%EC%A1%B0/