http://ctf.no-named.kr:1234/challenges
1번 문제를 풀면서, PNG 구조에 대해서 공부했다.
PNG
헤더 시그니처 : 89 50 4E 47 0D 0A 1A 0A
푸티지 : 49 45 4E 44 AE 42 60 82
구조 : N개의 Chunk들로 구성
Chunk의 구조는 다음과 같다.
{
Length (4 byte),
Chunk Type (4 byte),
Chunk Data (length byte),
CRC (4byte)
}
이러한 Chunk들 중, PNG 파일에 필수적으로 존재해야 하는 Chunk는 IHDR, IDAT, IEND가 있다.
하나라도 없으면, 파일이 열리지 않는다. 각각의 Chunk들이 식별되지 않아서 이미지 자체가 보이지 않는다.
IHDR : 49 48 44 52
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
}
49 48 44 52 앞에, Length인 0x 0D가 있음을 확인할 수 있다.
CRC는 IHDR이 끝나는 byte 다음부터 4개의 byte, 즉 여기서는 0x01897642 이다.
IHDR의 데이터 길이는 항상, 13byte길이로 고정되어 있다.
Width, Height가 적절하게 맞춰져 있지 않다면, 그림은 식별할 수 없게 보인다.
이렇게.
CRC의 값을 알고 있다면, Width,Height 값의 역산이 가능하다.
PNG Color Type | Value | Bit depth | 뜻 |
---|---|---|---|
Gray Scale | 0 | 1,2,4,8,16 | Gray Scale을 따른다 |
Truecolor | 2 | 8,16 | RGB를 따른다. |
Indexed-color | 3 | 1,2,4,8 | Phalette를 따른다다. |
Gray Scale with alpha | 4 | 8,16 | Gray scale + alpha를 따른다. |
Truecolor with alpha | 6 | 8,16 | RGB + Alpha를 따른다. |
Compression method
표준 압축 방식은 0: DEFLATE 유일
Filter method
표준으로 필터링 방식은 : 0 유일
Interlace method
이미지 로딩이 완료되기 전, 해상도가 낮은 이미지를 보여줌.
표준으로 정의 방식 : 0 (No interlace), 1 (Adam7 interlace) 유이
IDAT : 49 44 41 54
IDAT는 실제 이미지를 구성하는 데이터가 저장된다.
꼭 1개만 가지는 건 아니고, 여러개의 IDAT를 가질 수 있다. 1개의 IDAT당 65536 byte의 크기를 지닌다. 하지만, 전체 이미지는 압축되어 IDAT에 "나누어"담기기 때문에, 덩어리로 저장되는 것이 아니라 골고루 나뉘어 저장된다. 따라서 1개의 IDAT가 없으면 복구 불가능.
IEND : 49 45 4E 44
IEND에는 파일의 끝을 알려준다. (푸티지 시그니처)
https://joseoyeon.github.io/posts/png-%EA%B5%AC%EC%A1%B0/
https://ryanking13.github.io/2018/03/24/png-structure.html