안녕하세요! 이번에 디지털 포렌식에 입문하게 되어 먼저 PNG 파일을 공부해볼까 합니다!
저는 010Editor과 HxD라는 프로그램을 이용하니 참고하시길 바랍니다!
(까는 법은 구글링...)
먼저 제가 가지고 있는 PNG파일 3개를 010 Editor로 분석을 해보겠습니다!
이건 16진수로 분석된 파일인데요!
보시면 앞의 팥죽색...? 부분의 수가 89 50 4E 47 0D 0A 1A 0A 이 부분이 겹치는 걸 볼 수 있는데요!
저부분을 바로 파일 시그니처라고 합니다!
그럼 파일 시그니처라는 것부터 먼저 알아보자면
File Signature
: 파일의 내용을 식별하거나 확인하기 위해 사용되는 데이터
즉, 파일들은 각각 고유한 포맷을 가지고 있는데 포맷의 기본이 되는 내용이 파일 시그니처입니다!
파일 시그니처는 보통 헤더(Header)시그니처, 푸터(Footer)시그니처가 있습니다.
헤더 시그니처는 위에서 봤듯이 파일의 처음 부분에 존재하구요
푸터 시그니처는 파일의 마지막 부분에 존재하는 시그니처입니다.
그렇다면 이런 파일 시그니처는 어떨 때 쓰일지 궁금해지는데요!
예시를 한 번 들어보겠습니다!
이렇게 PNG파일과 JPG파일을 준비해봤습니다!
그럼 한 번 분석을 해볼까요??
먼저 PNG 파일의 시그니처는 아까 볼 수 있었듯이 89 50 4E 47 0D 0A 1A 0A 입니다!
다음으로 JPG 파일을 분석해봤는데요!
JPG의 파일 시그니처는 FF D8 입니다!
그런데!
제가 저 파일의 확장자를 건드려서 jpg파일을 png파일로 고쳐본다면요?!
분석결과 png로 확장자를 바꿔줬지만 FF D8 로 파일 시그니처는 바뀌지 않는다는 것을 알 수 있습니다!
그래서 이러한 파일 시그니처를 이용해서 파일 포맷 분석, 악성코드 분석, 파일 복구 등.. 여려 분야에서 사용 될 수 있답니다!
현재 파일 카빙도구에서 파일 시그니처는 파일을 복구하기 위해 없어서는 안 될 요소이기도 하죠!
이제 PNG 파일구조를 알아봅시다!
PNG파일구조는 파일 시그니처와 다양한 청크들의 집합으로 구성되어 있습니다.
몇번째 언급인지 모르겠지만,,,ㅎㅎ
PNG 파일 시그니처는 89 50 4E 47 0D 0A 1A 0A 이고 하나당 1byte라 총 8byte입니다!
여기서 89 50 4E 는 ASCII CODE로 PNG입니다!
또한 PNG 파일은 푸터 시그니처도 있는데요!
여기서 볼 수 있듯이 49 45 4E 44 AE 42 60 82 임을 알 수 있습니다!
PNG Header Signature
89 50 4E 47 0D 0A 1A 0A(8 Byte) 89 50 4E => PNG(ASCII CODE)
PNG Footer Signature
49 45 4E 44 AE 42 60 82(8 Byte)
Chunk
PNG파일구조는 파일 시그니처와 다양한 청크들의 집합으로 이루어져 있다고 말씀드렸는데요!
청크란, 공통된 데이터를 가지고 있는 데이터들의 집합입니다.
중요청크는 첫 글자가 대문자, 보조 청크는 첫 글자가 소문자로 쓰여 있구요
중요 청크에는 IHDR, IDAT, PLTE, IEND 청크가 있습니다!
이 중에서 IHDR, IDAT, IEND 청크는 PNG파일에 반드시 포함되어야 하는 청크입니다!
청크의 구조는 아래와 같은데요
{
Length (4 bytes),
Chunk Type (4 bytes),
Chunk Data (Length bytes)
CRC (4 bytes)
}
- Length는 Chunk Data의 길이
- Chunk Type은 청크의 타입, 즉 IHDR, IDAT, 등등 (ASCII CODE로 이루어졌다)
- Chunk Data는 실제 데이터가 들어간다. 또한 가변길이를 갖는다.
- CRC는 순환중복검사의 약자로 데이터의 오류가 있는지 확인하는 것이다.
PNG파일에 꼭 있어야 되는 청크는 IHDR, IDAT, IEND이니까 하나씩 살펴봅시다!
먼저 IHDR을 알아보겠습니다.
{
Length : 00 00 00 0D (4 bytes),
Chunk Type: IHDR(4 bytes),
Chunk Data (13 bytes (모든 IHDR은 Chunk Data가 13바이트이다.)),
{
Width (4 bytes),
Height (4 bytes),
Bit depth (1 byte),
Color Type (1 byte),
Compression method (1 byte),
Filter method (1 byte),
Interlace method (1 byte)
}
CRC (4 bytes)
}
IHDR청크는
PNG파일의 기본 정보를 담고있는 청크이며 데이터 길이는 언제나 13 byte입니다!
또한 이 청크는 시그니처 바로 뒤에 붙습니다!
여기엔 가로, 세로, 비트 깊이, 색 타입, 압축 메소드, 필터링 메소드, 인터레이스 메소드에 대한 정보가 담겨있는데요~
- Width와 Height는 이미지의 가로, 세로를 말하며 각각 4bytes씩 차지한다
- Bit Depth(1byte)는 한 픽셀이 차지하는 비트의 양을 의미한다
- Color Type(1byte)는 색의 유형을 숫자로 나타낸 것이다.
0번은 회색조, 2번은 RGB, 3번은 색인 색상, 4번은 투명도가 있는 회색조, 6번은 투명도가 있는RGB를 의미한다.
PNG image type |
Color Type |
Allowed bit depths |
interpretation |
Grayscale |
0 |
1, 2, 4, 8, 16 |
Grayscale Data |
Truecolor |
2 |
8, 16 |
RGB Data |
Indexed-color |
3 |
1, 2, 4, 8 |
Palette Data |
Grayscale with alpha |
4 |
8, 16 |
Grayscale + Alpha Data |
Truecolor with alpha |
6 |
8, 16 |
RGB + Alpha Data |
Indexed-color는 추가로 파일에 PLTE청크가 존재해야 되고 해당 청크에서 사용할 팔레트를 지정한다고 합니다.
이 상황을 벗어나는 이미지 데이터는 만들 수 없다고 합니다~
여기서 주목해야될 점은! 하나의 채널이 1byte보다 작은 단위의 비트로도 구성될 수 있다는 것이라고 합니다!
압축 메소드(Compression method), 필터 메소드(Filter method), 인터레이스 메소드(Interlace method)
이들은 압축, 필터, 인터레이스 하는 메소드의 종류를 숫자로 나타낸 값으로 1byte씩 차지한다.
압축 메소드는 현재까지 필터링 방식이 0 (Deflate) 한 가지이고, 필터링 메소드도 0 (Adaptive Filtering) 한 가지이다.
반면 현재까지 PNG에서 표준으로 정의된 인터레이스 메소드는 0 (No interlace), 1 (Adam 7 interlace) 두 가지이다.
/*
인터레이스 메소드란, 웹 페이지 등에 이미지를 표시할 때 이미지 로딩이 완료되기 전 먼저 해상도가 낮은 이미지를 보여주기 위하여 사용된다.
*/
그 다음으로 IDAT 청크를 알아보겠습니다!
{
Length (4 byte),
Chunk Type : IDAT(4 byte),
Chunk Data (Length byte),
{
Filtered, Compressed Data
.
.
}
CRC (4 byte)
}
IDAT 청크는 실제로 이미지 데이터가 들어가는 부분입니다!
한 개의 PNG파일은 여러개의 IDAT 청크를 가질 수 있는데, 이는 데이터를 스트리밍 방식으로 전송하기 위함입니다~
이때 모든 IDAT 청크가 있어야만 이미지 디코딩을 정상적으로 할 수 있다고 합니다!
그이유는 PNG가 전체 이미지 데이터를 한꺼번에 압축한 뒤, 여러 IDAT 청크에 나누어 담는 방식을 사용하기 때문인데요!
이때문에 모든 IDAT 청크가 있어야만 이미지 디코딩이 가능하다고 합니다~
그러면 반대로 압축을 풀고 필터링을 해제하면 원본 데이터를 얻을 수 있겠죠??
여기서 필터링이란!
원시 이미지 데이터의 압축률을 높이기 위하여 데이터를 가공하는 작업이라고 합니다~
PLET{
Length (4 byte),
Chunk Type : PLET(4 byte),
Chunk Data (Length byte),
{
RGB palette[0] (3 byte),
RGB palette[1] (3 byte),
.
.
}
CRC (4 byte)
}
PLET 청크(한 샘플당 8bit)는 색 공간을 표시하는 청크이다.
그래서 IDAT청크에서 PLET 청크의 색상 번호로 색을 표현하는 것이다.
Colot Type 3에는 PLET 청크가 필요하고, Color Type 2, 6에선 선택적으로 필요하다.
팔레트 항목 수는 bit depth로 표현할 수 있는 범위를 초과하지 않는다.
IEND{
Length : 00 00 00 00 (4 byte),
Chunk Type : IEND (4 byte),
Chunk Data (0 byte),
CRC (4 byte)
}
IEND 청크는 이미지 파일의 끝을 표시하는 청크이다. (길이는 0)
참고한 블로그 : eece-labs.tistory.com/7
'Hacking' 카테고리의 다른 글
ctf-d.com 원래 의미가 없는 것들도... (0) | 2020.08.12 |
---|---|
xcz.kr - 35 (0) | 2020.08.11 |
SuNiNaTaS Forensics - 28 (0) | 2020.08.11 |
webhacking.kr - challenge 26 (0) | 2020.08.10 |
XCZ.KR - PROB1.[1000]SOLVER:1333START! (0) | 2020.07.28 |