project/windows zero-day hunting

JP2 File format

프로젝트를 진행하면서 알아본 JP2 파일 포맷에 관한 내용들을 정리한 글이다. 전체적으로 필요한 부분만 사용하기 위해 알게 된 정보들이라 부족한 부분들이 있다. 그렇지만 자료가 많이 없어서 jp2 format을 찾는 사람들에게 조금이나마 도움이 될 수 있도록 글을 썼다.

JPEG2000 파일 포맷으로는 J2K파일과 JP2파일이 있다. J2K 파일은 이미지 래스터 정보와 기본적인 헤더 정보인 JPEG2000 CodeStream만을 포함하고 있어 이미지를 디스플레이하기 위한 정보만을 갖고 있다. 이에 반해 JP2파일은 J2K 파일에 있는 JPEG2000 CodeStream과 함께 여러 가지 부가적인 메타 데이터를 포함하고 있다.

JP2

jp2 file format은 다음과 같다.

[JP2 File Format 구조]

위 그림과 같이 JP2파일은 box라고 불리는 기본 요소로 이루어져 있으며 위 box 외에 여러 box가 존재한다.

 

JP2 Building Block

위 그림과 같이 box로 이루어져 있으며, box는 각각 다음과 같은 역할을 가진다.

  • LBOX (Length Box) : box의 길이가 4-byte big endian usigened integer값으로 저장된다. 0이나 1을 제외하고는 보통 이곳에 box의 실제 길이가 들어간다. Lbox의 실제 길이를 알 수 없거나, 파일의 마지막 box일 경우 LBox가 0이 된다. 8부터 실제 길이가 표시되며 1부터 7까지는 다른 용도로 사용된다.
  • TBox (Type Box) : box의 타입을 저장하는 곳으로 4-byte big endian unsigned integer형태로 저장된다.
  • XLBOX (Extended Length Box) : box의 확정된 길이로 8-byte big endian unsigned integer형태로 저장된다. LBox의 값이 1일 경우 실제 box의 길이를 저장하기 위해 사용된다.
  • DBox (Data Box) : box 안에 들어가는 실제 데이터가 DBox라는 형태로 저장된다.

 

JP2 Box

jp2파일이 기본적으로 요구하는 box는 다음과 같다.

  • JP2 Signature box : JP2 Signature box는 jp2 파일을 식별하는 box로서, 파일의 첫 번째 box여야 한다. 또한 이 box는 12바이트 문자열의 고정된 길이를 가져야 하며, 값은 다음과 같아야 한다. (00 00 00 0C 6A 50 1A 1A 0D 0A 87 0A)h

    • 버전? 의 차이인지 위와 같은 (00 00 00 0C 6A 50 1A 1A 0D 0A 87 0A) 가 아닐시 (00 00 00 0C 6A 50 20 20 0D 0A 87 0A) 로 고정되어 나타난다.
  • Profile box : JP2 Signature box 바로 다음으로 오는 box이다. TBox에는 'prfl' = (70 72 66 6c)h 이어야 하며, DBox 에는 브랜드(BR) 및 N 호환성 목록(CL) 정보가 포함되어야 한다. BR 및 CL 필드는 모두 ASCII 문자의 4바이트 문자열로 인코딩 된다.

    • profile box가 없을 경우 이 자리를 FileType Box (0x66747970)가 대신하는것 같다. File Type Box에서 LBox는 00 00 00 14로 20 byte 이며, TBox는 'ftyp' = (66 74 79 70)h 이고 DBox는 6A 70 32 20 00 00 00 00 6A 70 32 20 이다.
  • JP2 Header box : JP2 Header box는 여러 개의 박스가 들어있는 superbox이다. TBox는 'jp2h' = (6A 70 32 68)h 이며, 하나 이상의 Color Specification box가 포함되어야 한다. JP2 Header box는 Contiguous Code-stream box 앞에 위치해야 한다.

  • Image Header box : Image Header box 에는 높이, 너비 및 구성 요소 등 이미지에 대한 정보가 24 byte 만큼 들어있다. TBox는 'ihdr' = (69 68 64 72)h 이며, DBox 8개의 field로 나누어져 있다.

  • Color Specification box : Color Specification box는 완전히 압축 해제된 이미지 구성 요소에 대한 색상 공간을 지정한다. TBox는 'colr' = (63 6f 6c 72)h 이며, Dbox는 5개의 field로 나누어져 있다.

  • Contiguous Code-stream box : Contiguous Code-stream box는 유효하고 완전한 JPEG2000 code-stream이 포함되어 있다. 이 box는 파일의 마지막 box이기 때문에 LBox에 0으로 저장된다. TBox는 'j2pc' = (6A 70 32 63)h 이다.

 

 

Codestream

Codestream에는 여러 maker segment(SOC, SOT, SOD, EOC, SIZ, COD, COC와 RGN, QCD, QCC, POD, TLM, PLM, PLT, PLT, PPM, PPT, SOP, EPH, CME)를 사용을 하며, 이중 필수로 사용해야 하는 maker와 선택적으로 사용하는 maker가 있다.

아래는 maker segment표이다.

 

Codestream 전체 구조

Codestream은 다음과 같은 구조로 이루어져 있다.

위 구조와 같이 한 개의 main header와 여러 개의 tile-part header로 구성된다, main header는 SOC segment로 시작되며, 각 tile-part header는 SOT segment와 SOD 사이에 존재하고 실제 데이터는 SOD segment와 SOT 혹은 EOC segmnt 사이에 들어가게 된다.

 

Codestream Main & Tile Part Header

Main과 Tile part header는 다음과 같은 구조로 이루어져 있다.

  • Main header : main header는 그림과 같이 SIZ, COD, COC, QCD, QCC, RGN, POD, PPM, TML, PLM, CME등이 있으며, 이 중 SIZ, COD, QCD는 필수로 사용되고 나머지는 선택적으로 사용된다.

  • SIZ는 Immage and Tile Size로서 SOC maker segment 다음에 main header에 한 번 나타난다

 

  • COD는 Coding style default로 COC와 함께 이미지의 component의 압축에 관계된 정보를 담고 있는 부분이다.

  • QCD는 Quantization defualt로 QCC와 함께 압축과정 중 quatization 과정과 관련된 여러 가지 정보를 담고 있는 부분이다.

  • Tile Part Header : tile part는 그림과 같이 COD, COC, QCD, QCC, RGN, POD, PPT, PLT, CME 등이 있으며, 모든 maker가 선택적이다. 단, tile part header에 값이 들어가게 되면. main header의 정보와 overriding이 되어 타일에만 적용되는 정보를 담을 수 있게 된다.

Reference

'project > windows zero-day hunting' 카테고리의 다른 글

Tip  (2) 2020.02.28