File Forensic/File Analysis

[Digital Forensic] Zip File Structure Analysis

DF_m@ster 2024. 1. 5. 09:00

압축 파일의 구조와 현대의 마이크로소프트 오피스 문서 파일(: docx, xlsx, pptx, hwpx)의 구조는 동일하다. 이는 파일 크기를 줄이고, 텍스트, 이미지, 메타데이터와 같은 다양한 데이터를 보다 효율적으로 관리하기 위함이다. 이러한 이유로, 오피스 문서 파일을 압축 해제하면 파일의 내용을 직접 확인이 가능하다.

 

 

 

Zip File Structure

압축 파일의 구조는 크게 File Area, Central Directory Area, End of Central Directory로 나뉜다.

File Area: File Entry의 집합으로, 하나의 File Entry는 압축 파일에 포함된 하나의 파일 이름, 파일 데이터, 파일 메타 데이터 등을 포함한 Entry를 의미한다.

Central Directory Area: Directory Entry의 집합이다. 하나의 Directory Entry는 하나의 File Entry와 쌍을 이루며 File Entry의 주소를 포함하여 파일의 빠른 접근을 가능하게 한다.

End of Central Directory: Central Directory 시작 위치, 크기, 압축 파일에 포함된 파일의 개수 등의 정보를 포함한 영역이다.

Zip File Structure

 

 

 

File Access

압축 파일에서 특정 파일에 접근할 때의 과정은 다음과 같다. 먼저 'End of Central Directory'영역에서 시작하여 'Central Directory Header' 주소를 참조하여 'Central Directory Header'로 이동한다. 이후에 접근하려는 특정 파일에 맞는 'Directory Entry'로 이동하고 해당 'Directory Entry'의 'Local Header Offset'을 참조하여 특정 'File Entry'에 접근한다.

 

아래는 두 번째 파일에 접근하는 상황을 화살표 순서대로 시각화한 모습이다.

File Access

 

End of Central Directory Structure

아래는 End of Central Directory의 필드이고, 중요한 정보는 표로 정리해 두었다. 파일 카빙 시 Comment Length만큼을 포함한 영역을 카빙해야 한다.

Size Information
4 End of Central Directory Header Signature
(0x50 4B 05 06)
4 Central Header Offset
2 Comment Length
?? Zip File Comment

 

 

 

Directory Entry Structure

하나의 Directory Entry는 Central Directory Header, File Name을 포함한다.

Directory Entry Structure

 

아래는 Directory Entry의 필드이고, 중요한 정보는 표로 정리해 두었다. 시간과 날짜는 각각 '5(H)/6(M)/5(S), 7(Y)/4(M)/5(D) 법칙'으로 해석한다.

 

주의해야 할 부분은 플래그(Flag) 값의 해석이다. 플래그 값이 단순히 0x00, 0x06일 때 암호화 파일임을 의미하는 것이 아니다. 2바이트의 플래그 값을 이진수로 변환했을 때, 각 자리의 비트 값을 의미하는 것이다. 이진수로 변환된 2바이트의 플래그 값에서 하단 0번째 비트 혹은 6번째 비트가 '1' 설정되어 있다면, 파일은 암호화된 파일로 간주할 있다. 예를 들어, 이진수 표현에서 '???????? ???????1' 또는 '???????? ?1??????' 같은 형태가 된다.

Size Information
4 Central Directory Header Signature
(0x50 4B 01 02)
2 Flags
0x00: Encrypted File
0x01, 02: Compression Option
0x03: Data Descriptor
0x04: Enhanced Deflation
0x05: Compressed Patched Data
0x06: Strong Encryption
0x07 ~ 0A: Unused
0x0B: Language Encoding
0x0C: Reserved
0x0D: Mask Header Values
0x0E ~ 0F: Reserved
2 Compression
2 Modified Time
2 Modified Date
4 Compressed Size
4 Uncompressed Size
2 File Name Length
4 Local Header Offset
?? File Name

 

 

 

File Entry Structure

하나의 File Entry는 Local Header, File Name, File Data를 포함한다.

File Entry Structure

 

아래는 File Entry의 필드이고, 중요한 정보는 표로 정리해 두었다. 마찬가지로 시간과 날짜는 각각 '5(H)/6(M)/5(S), 7(Y)/4(M)/5(D) 법칙'으로 해석한다.

Size Information
4 Local Header Signature
(0x50 4B 03 04)
2 Flags
0x00: Encrypted File
0x01, 02: Compression Option
0x03: Data Descriptor
0x04: Enhanced Deflation
0x05: Compressed Patched Data
0x06: Strong Encryption
0x07 ~ 0A: Unused
0x0B: Language Encoding
0x0C: Reserved
0x0D: Mask Header Values
0x0E ~ 0F: Reserved
2 Compression
2 Modified Time
2 Modified Date
4 Compressed Size
4 Uncompressed Size
2 File Name Length
?? File Name
?? File Data

 

 

 

Zip File Test

압축 파일의 구조를 살펴보기 위해,  개의 텍스트 파일('test_1.txt', 'test_2.txt', 'test_3.txt') 포함하는 압축 파일을 만들었다. 각각의 파일에는 'test_1.txt file's info', 'test_2.txt file's info', 'test_3.txt file's info'라는 내용이 담겨 있다. 추가적으로 압축 파일의 암호화 여부에 따른 차이를 확인하기 위해, 하나는 암호화되지 않은 일반 압축파일, 다른 하나는 비밀번호('1234')로 암호화한 압축 파일로 총 2개의 압축파일을 생성하였다.

일반 압축 (좌) , 암호 압축 (우)

 

1. 일반 압축 파일

아래는 위에서 생성한 압축 파일 중 일반 압축 파일을 HxD로 열어본 결과이다. File Area는 빨간색으로, Central Directory Area는 초록색으로, End of Central Directory는 파란색으로 구분해 두었다. 파일을 3개 포함하고 있어, File Entry와 Directory Entry는 3개의 쌍이 존재한다. 추가적으로 Directory Entry의 핵심 정보인 Flag, Compression, Local Header Offset, FIle Name과 File Entry의 핵심 정보인 File Data를 각각 반투명 연두색과 빨간색으로 표시해 두었다.

 

Flag 값은 0x00으로 그 어떠한 의미도 없고, 내용으로 'test_1.txt file's info', 'test_2.txt file's info', 'test_3.txt file's info'가 정상적으로 확인된다.

일반 압축 파일

 

2. 암호화 압축 파일

위의 일반 압축 파일 분석에 사용한 표시에 더하여, File Entry에서 Compressed Size, Extra Field Length를 표시하였다.
File Entry에서 Extra Field는 파일의 이름이 표시된 후에 나타난다. 아래의 예시에서는 Extra Field Length가 0x0B이므로 이름이 끝나고 0x0B 이후부터 다음 Entry의 Header Signature('50 4B 03 04' or '50 4B 01 02') 전까지가 File Data 영역이다. 실제로 File Data의 크기가 0x32 Byte로 선택되었고, Compressed Size 값 또한 0x32로 정상적으로 File Data 영역을 추정했음을 확인할 수 있다. 추가적으로 Flag 값은 0x01로 이진수로 변환하면 '00000000 00000001'이 된다. 이는 해당 파일이 암호화되었음을 의미한다.

암호화 압축 파일

 

 

 

 

Reference

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

 

ZIP (file format) - Wikipedia

From Wikipedia, the free encyclopedia Family of archive file formats ZIP is an archive file format that supports lossless data compression. A ZIP file may contain one or more files or directories that may have been compressed. The ZIP file format permits a

en.wikipedia.org