촉촉한초코칩
[Dreamhack] broken-png 본문
파일
이미지는 이렇게 나온다. 시그니처를 살펴보았다.
png 구조 https://ryanking13.github.io/2018/03/24/png-structure.html
File signature : 89 50 4E 47 0D 0A 1A 0A
- 8바이트
- 50 4E 47 : ASCII 값으로 PNG를 나타냄
Chunk
- N개의 청크로 구성된다.
- 청크 타입은 여러 개가 있으며 그 중에서 모든 PNG 파일에 반드시 포함되어야 하는 청크는 IHDR, IDAT, IEND이다.
- 그 외의 쳥크는 PNG 파일 타입에 따라 요구되거나, 메타데이터를 저장하는 데에 사용된다.
{
Length (4 byte), # Chunk의 크기
Chunk Type (4 byte), # Chunk의 타입
Chunk Data (length byte), # Chunk 내용
CRC (4byte) # 오류 검사를 위한 값
}
IHDR (header)
- 13바이트
- PNG 파일의 가장 앞에 위치하는 청크
- 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
- 실제로 이미지 데이터가 들어가는 부분
- 이미지의 원본 픽셀 데이터가 필터링과 압축을거쳐서 IDAT 청크에 저장된다.
- 하나의 PNG 파일은 여러 개의 IDAT 청크를 가질 수 있는데, 이는 데이터를 적절한 사이즈로 나누어 전송하기 위한 것으로, 일반적으로 한 IDAT 청크당 65536 바이트의 데이터 크기를 갖는다. → 하나의 IDAT 청크가 이미지의 특정 부분을 나타내지 않으며, PNG는 전체 이미지 데이터를 한꺼번에 압축한 뒤 여러 IDAT 청크에 나누어 담는 방식을 사용한다. 따라서 모든 IDAT 청크가 있어야만 이미지 디코딩이 가능하다.
IEND
{
Length : 00 00 00 00 (0 byte),
Chunk Type : IEND,
Chunk Data (0 byte),
CRC
}
- 이미지의 맨 뒤에 위치하는 청크로 PNG 파일의 끝을 나타낸다.
- 데이터를 담는 목적이 아니므로 Length 값은 언제나 0이 된다.
공격
우선 원본 사진은 정사각형이라고 했으므로 IHDR에서 length, width 이부분을 통일 시켜보려고 했다.
- length : 00 00 02 00
- width : 00 00 01 00 이므로 → width를 2로 수정해보았다..
바뀜!
'Study > MISC' 카테고리의 다른 글
[Dreamhack] addition-quiz (0) | 2024.09.11 |
---|---|
[Dreamhack] littlevsbig (0) | 2024.09.04 |
[Dreamhack] **Exercise: Docker (0) | 2024.08.20 |
[Dreamhack] dreamhack-tools-cyberchef (0) | 2024.08.12 |
[Dreamhack] baby-linux (0) | 2024.08.12 |