zip 파일 구조에 대한 분석
zip파일 이란? 하나 이상의 파일을 하나로 합쳐주는 것, 파일의 크기를 줄여 보다 쉽게 전송 및 저장이 가능함.
위의 그림은 zip 파일의 간략한 구조로 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
* 날짜 계산
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/
'Forensic' 카테고리의 다른 글
[Forensic] FAT32 / NTFS / exFAT 파일시스템 정리 (2) | 2024.07.25 |
---|---|
[Forensic] zipper (3) | 2024.07.24 |
[Forensic] steganography - Mountains beyond mountains (0) | 2024.07.24 |
[Forensic] Steganography 개념 및 툴 정리 (2) | 2024.07.24 |
[Forensic] broken-png (Dreamhack) (2) | 2024.07.23 |