[ 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 |
2bytes |
압축 방법 00: no compression |
2bytes |
파일의 마지막 수정 시간 Bits 00-04: seconds - 2로 나누어져 있음. *2 해야 실제 초. |
2bytes |
파일의 마지막 수정 날짜 MS-DOS 표준 포맷 |
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 |
이어서 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: |
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 |
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 |