본문 바로가기

취약점 분석/여러가지 구조 형식

JPEG 헤더 구조

JPEG header structure


JPEG, JPG는 손실 압축된 파일이다. 불필요한 픽셀들을 제거하는 방식으로 좋은 화질을 유지하며 큰 압축 효과를 얻지만 원본과는 어느정도 차이가 발생한다.


아래 설명에서 JFIFJPEG File Interchange Format)는 JPEG 인코딩을 준수하는 파일을 JIF(JPEG Interchange Format)로 변환하기 위한 format이다.


JFIF는 JFIF Marker들과 JFIF Marker Segment들로 구성된다.

(Segment없이 Marker만 독립적으로 있기도 함.)


우선 파일의 전체적인 틀은 다음과 같다.

 JFIF file structure

 Segment

 Code 

 Description 

 SOI

 FF D8

 Start Of Image를 의미. "FF D8" 고정.

 JFIF-APP0

 FF E0 s1 s2 4A 46 49 46 00 ...

 JFIF APP0 Marker 블럭. (무조건)

 아래에서 따로 설명함!

 JFXX-APP0

 FF E0 s1 s2 4A 46 49 46 00 ...

 JFIF extension APP0 marker 블럭. (선택적)

 아래에서 따로 설명함!

 

 ... 추가적인 marker segments (예를 들어 SOF, DHT, COM 등)


 제일 아래 사진 참고.


 SOS

 FF DA

 Start of Scan "FF DA" 고정.

 압축된 이미지 데이터

 EOI

 FF D9

 End of Image "FF D9" 고정.



이어 구성 요소를 조금 더 세부적으로 살펴보자.


JFIF APP0 marker는 무조건 존재하며, SOI인 "FF D8"바로 다음에 위치한다.

JFIF APP0 marker segment 구조는 아래와 같다.

 JFIF APP0 marker segment

 Field

 Size

 (bytes)

 Description

 App0

 marker

 2

  "FF E0" 고정

 Length

 2

  APP0 필드 길이

( Length부터 YThunmnail 끝까지의 길이)


= 16 + 3 * XThumbnail * YThumbnail

 Identifier

 5

 "4A 46 49 46 00" 고정

  "JFIF (null terminated)" 고정 문자열.

 JFIF version

 2

 JFIF의 버전.

 major revision과 minor revision 각각 1byte차지.


 "01 02"일 경우 => 1.02 version 으로 해석.

 Density units

 1

  • "00" : No units; width:height 비율 = Ydensity:Xdensity
  • "01" : Pixels per inch (2.54 cm)
  • "02" : Pixels per centimeter

 Xdensity

 2

 가로 픽셀 density. 0이면 안됨.

 Ydensity

 2

 세로 픽셀 density. 0이면 안됨.

 Xthumbnail

 1

 맨뒤의 RGB Thumbnail의 가로 픽셀 count. 0도 가능.

 Ythumbnail

 1

 맨뒤의 RGB Thumbnail의 세로 픽셀 count. 0도 가능.

 Thumbnail

 Data

 3 * n

 Uncompressed 24 bit RGB raster thumbnail data.

 8비트가 하나의 색으로, R0, G0, B0, ... , Rn-1, Gn-1, Bn-1 이렇게;

 n = Xthumbnail * Ythumbnail


JFIF extension APP0 marker segment는 옵셔널하게 존재하며, 존재한다면 APP0 segment 바로 뒤에 이어서 나온다. (1.02버전 이상에서만 지원하며, thumbnail image를 3가지 포멧으로 embed 할 수 있음.)

구조는 아래와 같다.

 JFIF extension APP0 marker segment

 Field

 Size

 (bytes)

 Description

 APP0 marker

 2

 "FF E0" 고정

 Length

 2

 marker를 제외한 extension APP0 세그먼트 길이 

 Identifier

 5

 "4A 46 49 46 00" 고정

 "JFXX (null terminated)" 고정 문자열

 Thumbnail format

 1

 바로 다음에 오는 embedded thumbnail format.

  • "10" : JPEG format
  • "11" : 1 byte per pixel palettized format
  • "13" : 3 bytes per pixel RGB format

 Thumbnail data

 variable

 Thumbnail format에 따른 데이터.


format에 따른 3가지 Thumbnail은 아래와 같다.


1. "10" : JPEG format

 JPEG encoding을 이용해 저장된 Thumbnail

 Field

 Size (bytes)

 Description

 SOI

 2

 "FF D8" 고정

 

 variable

 JIF 포맷이어야함. ( JFIF 또는 JFXX 세그먼트는 포함하면 안됨. )

 EOI

 2

 "FF D9" 고정


2. "11" : 1 byte per pixel palettized format

 one byte per pixel을 이용해 저장된 Thumbnail

 Field

 Size (bytes)

 Description

 Xthumbnail

 1

 섬네일 가로 픽셀 카운트. 0이면 안됨.

 Ythumbnail

 1

 섬네일 세로 픽셀 카운트. 0이면 안됨.

 Thumbnail palette

 768

 256 palette entries, 하나가 24 bit RGB color value.

 Thumbnail data

 n

 palette안의 색의 index를 포함하는 One byte per pixel


 n = Xthumbnail * Ythumbnail


3. "13" : 3 bytes per pixel RGB format

 three bytes per pixel을 이용해 저장된 Thumbnail

 Field

 Size (bytes)

 Description

 Xthumbnail

 1

 섬네일 가로 픽셀 카운터. 0이면 안됨.

 Ythumbnail

 1

 섬네일 세로 픽셀 카운터. 0이면 안됨.

 Thumbnail data

 3 * n

 Uncompressed 24 bit RGB raster thumbnail data.

 (8bits당 컬러 하나)

 R0,G0,B0, ... , Rn-1,Gn-1,Bn-1 순으로.


 n = Xthumbnail * Ythumbnail


구조 설명은 여기서 마무리된다.

=================================================================

마지막으로 여러가지 JPEG marker들을 살펴보자.

사진 출처 : 위키피디아 ( https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure )

'취약점 분석 > 여러가지 구조 형식' 카테고리의 다른 글

EXIF Format  (0) 2018.11.28
ZIP Archive file format  (0) 2018.09.19
GZIP header format (.gz extention)  (0) 2018.01.10