Forensic

[파일 구조] png

chimita 2022. 7. 28. 19:12

png 파일?

- wargame, CTF 대회 등에서 많이 사용되는 이미지 파일이며, 다양한 청크들의 집합으로 이루어져 있다.

 

시그니처

- 헤더 : 89 50 4E 47 0D 0A 1A 0A 

- 푸터 : 49 45 4E 44 AE 42 60 82

 

Chunk

- png 파일은 N개의 청크(chunk)로 구성된다. 

*청크 : 공통된 데이터를 가진 데이터의 집합

 

청크에는 다양한 종류가 있는데 그 중에서 png 파일에 꼭 들어가야하는 3가지의 청크가 있다.

  • IHDR
  • IDAT
  • IEND

이 세가지를 보면 모두 대문자인 것을 알 수 있다.

왜 다 대문자일까?

그건 이 세가지가 중요하기 때문이다.

중요한 청크는 대문자로 시작하고, 보조 청크는 소문자로 시작한다.

 

이 외의 청크는 PNG파일의 타입에 따라 요구되거나, 또는 메타데이터를 저장하는 데에 사용된다.

 

Chunk의 구조

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

Length : Chunk Data의 길이

Chunk Type : 청크의 타입 (IHDR, IDAT 등)

Chunk Data : 실제 데이터 

CRC : 순환 중복 검사 (데이터 오류 확인)

 

Chunk의 종류

- IHDR

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
}

- IDAT

PNG 파일 중간에 위치하는 청크로 실질적인이미지 데이터의 정보 를 가지고 있다.

필터링과 압축을 거쳐서 IDAT 청크에 저장된다.

Encoding : Pixel Data(Original data) --> Filter --> Compression --> IDAT chunk data

Decoding : IDAT chunk data --> Decompression --> Unfilter --> Pixel data

- IEND

PNG 파일 마지막에 위치하는 청크로 PNG 파일의 끝 을 나타낸다.

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

데이터를 담는 목적으로 사용하지 않으므로 Length 값은 언제나 0이다.


PNG 파일 분석

헤더 시그니처인 89 50 4E 47 0D 0A 1A 0A 를 볼 수 있다.

여기서 헤더 시그니처가 하나라도 다른 값으로 변경 될 경우 파일이 손상되어 열리지 않는다.

 

헤더 시그니처 오른 편에 파란 글씨로 49 48 44 52 데이터 값을 볼 수 있다.

이 값을 ASCII Code로 변환하면 IHDR 이라는 단어가 나온다. 

3가지의 청크 중 IHDR이 잘 있는 것을 확인했다.

 

IDAT 의 값인 49 44 41 54를 검색하면 여러 개의 데이터가 나온다.  

이처럼 한 png 파일에는 한개의 IDAT 뿐만 아니라 여러 개의 IDAT 값이 들어갈 수 있다.

*png 파일은 데이터를 스트리밍 방식으로 전송하기 때문

 

만약 해당 파일과 같이 IDAT 값이 여럿일 경우, 하나의 IDAT가 손상되어도 파일이 열리지 않는다.

왜냐하면, png 파일이 전체적으로 하나의 데이터로 압축한 다음 여러 개의 IDAT 청크 값으로 나누어 저장하기 때문!

마지막으로 IEND 부분을 살펴 보면 49 45 4E 44 의 값을 확인 할 수 있다.

 

푸터 시그니처인 49 45 4E 44 AE 42 60 82 도 확인 할 수 있다!