본문 바로가기

FORENSIC

[SWING] Forensic 01

시그니처 및 파일 구조 문서화

 

1. 시그니처

 

파일 매직 넘버라고도 한다.

파일 형식에 따라 달라지는 고유한 특징으로,

앞에 오는 숫자는 헤더 시그니처이고, 뒤에 오는 숫자는 푸터 시그니처라고 한다.

푸터 시그니처는 없는 파일 포맷도 존재한다.

 

파일은 파일 시스템에 저장되는 기본 단위로,

파일은 일반적으로 이름과, 해당 파일의 유형을 나타내는 확장자를 부여받는다.

확장자는 임의로 변경할 수 있기 때문에 확장자만으로 파일의 특성을 파악하는 것은 섣부르다.

 

파일 내부의 특정 위치의 몇 바이트가 항상 동일한데, 이러한 고정 값을 시그니처(signature)라고 한다.

시그니처도 변경이 불가능한건 아니지만 확장자에 비해 용이하지 않고, 시그니터가 변경된 경우엔 해당 파일을 처리하는 응용 프로그램에서조차 파일을 인식하기 어렵기 때문에 시그니처를 이용해 파일의 특성을 파악해야 한다.

 

일반 텍스트 파일은 텍스트 편집기를 이용해서 쉽게 편집할 수 있다.

그러나 텍스트가 아닌 데이터가 다수 존재하며 텍스트 편집기로는 열람할 수 없는 파일을 분석할 때는 헥스 에디터를 사용한다.

대표적인 무료 헥스 에디터인 HxD라는 프로그램에서 시그니처를 비롯해 다양한 형식의 데이터를 확인할 수 있다.

 

 

File Type Header Signature (Hex) Footer Signature (Hex)
JPEG FF D8 FF E0
FF D8 FF E8
FF D9
GIF 47 49 46 38 37 61
47 49 46 38 39 61
00 3B
PNG 89 50 4E 47 0D 0A 1A 0A 49 45 4E 44 AE 42 60 82
PDF 25 50 44 46 2D 31 2E 25 25 45 4F 46
ZIP 50 4B 03 04 50 4B 05 06
ALX 41 4C 5A 01 43 4C 5A 02
RAR 52 61 72 21 1A 07 3D 7B 00 40 07 00
MP3 49 44 33 03  
HWP 4A 41 52 43 53 00  

 

더 많은 파일 시그니처를 알고 싶다면 아래의 링크들을 보면 된다. 여기에 전부 적기에는 너무 길어서 링크로 대체한다.

 

파일 시그니처 모음 (Common File Signatures) | FORENSIC-PROOF

List of file signatures - Wikipedia

File Signatures (garykessler.net)

 

 

2. 파일 구조

 

PNG

 

PNG의 파일 구조는 시그니처와 청크(chunk)들의 집합으로 구성되어 있다.

청크는 공통된 데이터를 가지고 있는 데이터들의 집합을 말한다.

중요한 청크는 첫 글자가 대문자, 보조 청크는 첫 글자가 소문자이다.

PNG 파일에 반드시 포함되어야 하는 청크에는 IHDR, IDEA, IEND 청크가 있다.

 

청크의 구조는 다음과 같다.

 

{
Length (4 byte),
Chunk Type (4 byte),
Chunk Data (length byte)
CRC (4 byte)
}

 

각각의 항목이 의미하는 바는 아래와 같다.

 

length : 청크 데이터의 길이

chunk type : IHDR, IDAT 등 청크의 타입

chunk data : 가변 길이의 실제 데이터

CRC : 순환중복검사의 약자로 데이터에 오류가 있는지 확인

 

 

1. IHDR

Image Header의 약자로, 이미지 헤더 정보를 담고 있다.

시그니처의 바로 뒤에 붙으며 길이는 언제나 13 byte이다.

 

Width와 Height는 이미지의 가로, 세로를 말하며 이미지의 크기를 나타낸다.

Bit Depth는 한 픽셀이 차지하는 비트의 양을 의미한다.

Color Type은 생의 유형을 의미한다.

Compression method는 압축 방식을 의미한다.

Filter method는 필터링 방식을 의미한다.

Interlace method는 웹 페이지 등에 이미지를 표시할 때 이미지 로딩이 완료되기 전 먼저 해상도가 낮은 이미지를 보여줄 때 사용되는 것으로 0과 1 두가지가 png 표준으로 정의되었다.

 

{
Length : 00 00 00 0D (13 byte),
Chunk Type : IHDR,
Chunk Data ( 13 byte ),
{
Width (4 byte), 
Height (4 byte), 
Bit depth (1 byte), 
Color Type (1 byte), 
Compression method (1 byte), 
Filter method (1 byte), 
Interlace method (1 byte),
}
CRC
}

 

2. IDAT

Image Data의 약자로, 실제 이미지 데이터 정보가 담겨 있다.

이미지 데이터는 데이터를 스트리밍 방식으로 전송하기 위해 전체 이미지 데이터를 한꺼번에 압축한 뒤 여러 IDAT 청크로 나뉘어 저장하는데,

전체 IDAT 청크가 있어야 디코딩이 가능하다.

 

{
Length(4 byte),
Chunk Type:IDAT(4 byte),
Chunk Data (Length byte),
{
Filtered, Compressed Data
.
.
.
}
CRC (4 byte)
}

 

3. IEND

이미지 맨 뒤에 존재하는 청크로,

아무 데이터도 없기 때문에 길이는 항상 0이다.

 

{
Length: 00 00 00 00 (0 byte),
Chunk Type : IEND,
Chunk Data (0 byte),
CRC
}

 

 

 

 

JPG

 

JPG는 정지 화상을 위해서 만들어진 손실 압축, 무손실 압축(JPEG 9.1부터) 방법 표준이며,

.jpg, .jpeg, .jpe, .jfif 등의 확장자를 사용한다.

압축 과정은 [ YIQ모델로 변환 → Macroblock화 → 8×8블록화 → 이산 코사인 변환 → 양자화 → 지그재그 스캐닝 → 엔트로피 코딩 ]의 단계를 거치는데,

양자화 과정이 유일하게 되돌릴 수 없는 과정으로, 이 과정에서 일부 데이터가 소실되는데 이때 디지털 풍화 현상 등이 발생한다.

 

JPEG 파일 구조란 JFIF(JPEG File Interchange Format)을 의미한다.

JPEG 파일은 다음과 같이 여러 개의 블록으로 나뉘어져 있다.

SOI (Start Of Image)
APP0 JFIF Marker
추가 APP Marker (APP0 ~ APP15) 또는 주석 (COM) marker
DQT (Define Quantization Tables)
SOF (Start Of Frame)
DHT (Define Huffman Tables)
SOS (Start Of Scan)
스캔 데이터
EOI (End Of Image)

 

초록색 글씨는 위치 순서가 유동적으로 바뀔 수 있는 부분이다.

 

SOI(Start Of Image)

시그니처 : FF D8

JPEG 이미지가 시작됨을 알린다.

 

APP Marker

시그니처 : FF E0~EF (APP0~APP15)

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

APP0의 경우, 'JFIF' 문자열(5byte)을 가지고 있으며,

APP1의 경우, 'Exif' 문자열(6byte)을 가지고 있다.

추가 APP Marker

시그니처 : FF E0~EF (APP0~APP15)

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

추가적인 문자열 정보를 담고 있다.

 

DQT (Define Quantization Tables)

시그니처 : FF DB

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

양자화 테이블(Quantization table)을 보관하는 블록이다.

 

SOF (Start Of Frame)

시그니처 : FF C0

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

이미지의 크기 및 샘플링에 관한 정보를 담는 블록이다.

 

DHT (Define Huffman Tables)

시그니처 : FF C4

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

Huffman 코드 테이블을 보관하고 있는 블록이다.

 

SOS (Start Of Scan)

시그니처 : FF DA

시그니처 다음 2byte 만큼의 Section Size 영역이 있다. (다음 구조를 가르킴.)

각 성분들이 어떤 Huffman table을 사용할지 알려주는 블록이다.

 

Scan Data

픽셀들의 색 정보를 샘플링-DCT-양자화-Huffman coding 과정을 거쳐 만들어낸 데이터 영역이다.

EOI (End Of Image)

시그니처 : FF D9

푸터 시그니처로, JPEG 형식의 이미지가 끝남을 알린다.

 

 

APNG

 

.apng(Animated Portable Network Graphics) 확장자를 가진 파일은 래스터 그래픽 형식이며 Portable Network Graphic(PNG)의 비공식 확장자이다.

애니메이션 시퀀스를 나타내는 여러 프레임(각각 PNG 이미지)으로 구성되어 GIF 파일과 유사한 시각화를 제공한다. APNG 파일은 24비트 이미지와 8비트 투명도를 지원한다.

 

APNG는 PNG 파일을 읽는 애플리케이션이 이해하지 못하는 청크를 무시하도록 설계되었기 때문에 측면 사양이 PNG와 역호환된다.

비트 심도, 색상 유형, 압축, 필터, 인터레이스 방식 및 팔레트 정보에 대한 사양은 기본 PNG 형식과 동일하게 사용된다.

 

중요 청크(critical chunks) : IHDR, PLTE, IDAT, IEND

: 최소한의 PNG를 이루기 위해서는 3개의 청크가 필요하다.

 IHDR, 하나 이상의 IDAT, IEND

 

보조 청크(ancillary chunks)

1) 투명성 정보 : tRNS 

2) 색 공간 정보 : cHRM, qAMA, iCCP, sBIT, sRGB

3) 텍스트 정보 : iTxt, tEXt, zTXt

4) 기타 정보 : bKGD, hIST, pHYs, sPLT

5) 시간 정보 : tIME

 

APNG 파일은 디스크에 바이너리 파일로 저장되며 애니메이션 이미지에는 PNG 확장 사양을 사용한다.

첫번째 프레임은 PNG 디코더에서 읽을 수 있는 일반 PNG 스트림이다.

 

[PNG 시그니처, IHDR, acTL]  시작을 알리고,

[fcTL, IDAT] 이 첫번째 프레임이 된다.

 

IDAT 앞에 단일 fcTL 청크가 존재해야 첫번째 프레임이 된다.

그렇지 않으면 애니메이션에 포함되지 않는다.

 

두번째 프레임부터는 IDAT 청크와 동일한 구조를 갖는 fdAT 청크로 인코딩된다.

 

각 프레임마다 fcTL이 존재하는데 이 순서는 절대 섞이면 안된다.

'청크 시퀀스 번호'를 보고 fcTL의 순서를 맞춰줘야 한다.

 

첫번째 fcTL 청크는 시퀀스 번호 0을 포함해야 하며,

나머지 fcTL 및 fdAT 청크 시퀀스 번호는 중간에 띄우거나 중복되면 안 된다.

 

APNG 파일 형식은 PNG 사양을 따르며 데이터는 청크라는 세그먼트에 저장되는데,

APNG는 다음과 같은 새로운 청크들을 도입했다.

 

Animation Control Chunk (acTL)

이 파일이 일반 PNG 파일이 아닌 애니메이션 PNG 파일임을 나타낸다.

마커 역할을 하며 IDAT 청크 앞에 온다.

프레임 수와 애니메이션을 반복하는 시간에 대한 정보도 포함한다.

 

Frame Control Chunk

각 시작 시 발생한다.

치수, 위치, 투명도 적용, 종료 후 이전 또는 다음 프레임으로 대체 정보 등의 메타데이터 정보가 발생한다.

 

Frame Data Chunk

프레임의 내용을 저장하고 기본 이미지의 IDAT 청크와 구조가 동일한 시퀀스 번호로 시작한다.

 

 

 

 

 

 

 

ZIP

 

 

ZIP 파일 형식에서 사용하는 압축 알고리즘은 크게 두 개로 나뉠수 있는데,

Entropy(huffman, Arithmetic)와 사전 코딩(LZ77, LZW)으로 나눌 수 있다.

ZIP 파일은 많은 사람들이 huffman(허프만 부호화)알고리즘을 쓰고 있다고 오해를 할 수 있지만

ZIP은 Deflate 알고리즘을 사용한다.

Deflate 알고리즘은 코딩에 있는 LZ77 알고리즘을 통해 데이터를 압축하고,

중복되는 내용의 위치와 길이를 huffman을 사용하여 한 번 더 압축한다.

 

ZIP 파일의 일반적인 구조는 크게 3개의 파일 구조 (Local File Header, Central Directory, End of central directory record)로 되어 있다.

 

 

 

Local File Header
압축 파일에 대한 기본 정보들이 포함되어 있다.

Local File Header 시그니처, 압축 전 파일 크기, 압축 후 파일 크기, 파일 최종 수정 시간, 파일 최종 수정 날짜, CRC-32정보, 파일 이름, 파일 이름 길이 등등이 포함된다.

 



File Name
압축된 파일 이름 형식에 대한 임의의 길이와 바이트 순서를 나타내고,

파일 이름의 최대 길이는 65536 문자를 초과할 수 없다.

File Data
임의의 길이로 구성된 바이트 배열 형태로 압축된 파일 컨텐츠이다.

파일이 비어 있거나 디렉토리를 포함하는 경우 이 배열은 사용되지 않지만 그 다음 Local File Header 제목은 해당 파일이나 디렉토리를 설명한다.

Central Directory
Local File Header의 확장된 데이터 뷰를 제공한다.

Local File Header에 포함된 데이터를 더하여 파일 속성, 구조에 대한 로컬 기준을 가진다.

 



End of Central Directory record
모든 아카이브의 싱글 템플릿으로 제공하며 아카이브의 종료를 작성한다.

포함된 데이터에서 가장 중요한 데이터는 Central Dircetory 블록의 시작과 로컬 참조의 시작, 아카이브 레코드들의 숫자이다.

 

 

'FORENSIC' 카테고리의 다른 글

keyboard warrior.pcap  (0) 2023.05.20
Shark's secret.pcapng  (0) 2023.05.20
who_is_it.pcap  (0) 2023.05.20
find_pw.pcapng  (0) 2023.05.20
Digital Forensic Low  (0) 2023.05.13