이번에 풀어볼 문제는 드림핵의 broken-png 문제 (https://dreamhack.io/wargame/challenges/104)입니다.
broken-png
Description 드림컴퍼니에서 디자이너로 일하는 드림이는 직장 동료에게 내일 사용해야 하는 드림뱅크의 홍보 이미지를 메일을 통해 전달 받았습니다. 하지만 이메일 전송 과정에서 문제가 발생해
dreamhack.io
주어진 파일을 보니 플래그를 담은 이미지의 일부로 보이고, 문제 설명을 보면 원래 정사각형이어야 하는 이미지가 반만 업로드되어 복원해야한다고 합니다.
HxD 에디터를 사용해서 문제 파일을 열어보면 89 50 4E 47 0D 0A 1A 0A 라는 PNG 파일의 헤더와 49 45 4E 44 AE 42 60 82 라는 푸터 시그니처를 확인할 수 있습니다.
혹시 반으로 잘려있다는게 파일 중간에 푸터 시그니처가 하나 더 있어서 파일의 절반 부분에서 파일의 끝으로 인식하게 하는건지 싶어서 IEND 문자열을 검색해봤는데 IEND 문자열은 파일 맨 마지막에 하나만 찾을 수 있었습니다.
그렇다면 어떻게 png 파일을 원래대로 복원할 수 있을지 검색해보니 png 파일 구조를 알아야 하는 것 같습니다.
png 파일 구조
참고 https://www.w3.org/TR/png/#4Concepts.Format
Portable Network Graphics (PNG) Specification (Third Edition)
PNG provides the tEXt, iTXt, and zTXt chunks for storing text strings associated with the image, such as an image description or copyright notice. Keywords are used to indicate what each text string represents. Any number of such text chunks may appear, an
www.w3.org
png 파일은 png 파일 시그니처(89 50 4E 47 0D 0A 1A 0A)와 청크들로 이루어져 있다고 합니다.
청크의 구조는 다음과 같습니다.
Length (4Byte)
Chunk Type (4Byte)
Chunk Data (Length에 따라 다름)
CRC (1Byte)
이 중 CRC는 오류 검사를 위한 값으로, CRC를 계산하는 알고리즘은 아래 링크에 나와있습니다.
https://www.w3.org/TR/png/#D-CRCAppendix
Portable Network Graphics (PNG) Specification (Third Edition)
PNG provides the tEXt, iTXt, and zTXt chunks for storing text strings associated with the image, such as an image description or copyright notice. Keywords are used to indicate what each text string represents. Any number of such text chunks may appear, an
www.w3.org
청크에는 다양한 종류가 있는데, 그 중에 png 파일에 필수적인 네 개의 필수 청크가 있습니다.
- IHDR: image header, which is the first chunk in a PNG datastream.
- PLTE: palette table associated with indexed PNG images.
- IDAT: image data chunks.
- IEND: image trailer, which is the last chunk in a PNG datastream.
IHDR 청크는 image header라는 뜻으로 png 시그니처 바로 뒤에 위치해서 이미지의 크기, 필터링 방식, 압축 방식 등의 정보를 담고 있습니다.
Width | 4 bytes |
Height | 4 bytes |
Bit depth | 1 byte |
Colour type | 1 byte |
Compression method | 1 byte |
Filter method | 1 byte |
Interlace method | 1 byte |
PLTE 청크는 pallete라는 뜻으로 IHDR 청크의 Colour type 값에 따라 필요하지 않을 수도 있습니다
Red | 1 bytes |
Green | 1 bytes |
Blue | 1 byte |
IDAT 청크는 image data라는 뜻으로 필터링과 압축을 거친 실제 이미지 데이터가 저장되는 청크입니다. IDAT 청크는 여러 개가 있을 수 있으며 이런 경우에는 모든 IDAT 청크의 데이터를 합쳐서 png 이미지가 만들어지게 됩니다. 일반적으로는 한 IDAT 청크당 65536 바이트의 데이터를 저장합니다.
IEND 청크는 png 파일의 푸터 시그니처로 알고 있는 49 45 4E 44 AE 42 60 82 값입니다.
필수 청크 외에도 여러 기능을 하는 아래 청크들이 있습니다.
- Transparency information: tRNS
- Colour space information: cHRM, gAMA, iCCP, sBIT, sRGB, cICP, mDCv
- Textual information: iTXt, tEXt, zTXt
- Miscellaneous information: bKGD, hIST, pHYs, sPLT, eXIf
- Time information: tIME
- Animation information: acTL, fcTL, fdAT
png 파일 구조를 살펴본 결과 IHDR 청크에서 height 값을 width 값과 동일하게 맞춰주면 문제에서 원하는 정사각형 png 파일이 만들어질 것 같습니다.
IHDR 청크를 보니 width 값은 0x200(10진수 512), height 값은 0x100(10진수 256)으로 설정되어있습니다.
height 값을 0x200으로 맞춰주고 저장하고 나면 문제 파일을 복구할 수 있습니다.
문제를 풀어보면서 png 파일 구조에 대해 알아볼 수 있었고, HxD 에디터의 편집 기능을 사용해 파일을 패치해볼 수 있었습니다.
'정보보안 > Forensics' 카테고리의 다른 글
[forensicscontest.com] evidence03 (SKS 포렌식 스터디 week2) (0) | 2024.07.24 |
---|---|
[forensicscontest.com] evidence02 (SKS 포렌식 스터디 week2) (1) | 2024.07.24 |
[PlaidCTF] zipper (SKS 포렌식 스터디 week1) (0) | 2024.07.19 |
[xcz.kr] Mountains beyond mountains (SKS 포렌식 스터디 week1) (0) | 2024.07.18 |
[CTFlearn] forensics 101 (SKS 포렌식 스터디 week1) (0) | 2024.07.16 |