촉촉한초코칩

[Dreamhack] broken-png 본문

Study/MISC

[Dreamhack] broken-png

햄친구베이컨 2024. 9. 4. 00:29

 

파일

이미지는 이렇게 나온다. 시그니처를 살펴보았다. 

 

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