ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2팀_장지은_Write_Ups (HackCTF_Magic PNG)
    2021/Write-Ups 2022. 1. 12. 23:46

    HackCTF의 [Forensics파트] 'Magic PNG'를 풀어보겠습니다.

     

     

    첨부된 'MP_1.zip' 파일에는 'MP_1.PNG' 파일이 들어있는데, 열어보니 다음과 같았습니다.

     

     

    파일 형식이 지원되지 않는다고 하네요. Hxd 프로그램에 넣어 봅니다.

     

    헤더가 잘못된 걸 알 수 있습니다.

    저번 게시글을 참고해볼까요?

     

     

    PNG의 헤더는 89 50 4E 47 0D 0A 1A 0A 입니다.

    파일의 헤더는 89 50 4E 47 2E 0A 2E 0A 로 되어있네요. 

     

    푸터도 다른가 확인해봤습니다.

     

     

     

    다행히도 푸터는 정상적이네요. 헤더만 변경해서 저장해볼까요?

     

    온전하지 않아보입니다. 여기서부터는 검색의 도움을 받았습니다.


    /PNG 파일 구조의 이해

     

    PNG 파일 구조 = 파일 시그니처 + 다양한 청크들의 집합

     

    -  파일 시그니처 : '이 다음부터 나오는 데이터는 어떤 포맷(형식)을 따른다.' 라는 것을 알려준다. (8B)

    - 청크 : 공통된 데이터를 가지고 있는 데이터들의 집합

     

    - 청크의 형식(구성)

        -> Length : Chunk Data의 길이 (4B)

        -> Chunk Type : 청크의 타입 (like IDHR, ASCII코드로 이루어짐 ) (4B)

        -> Chunk Data : 실제 데이터

        -> CRC : Cyclic Redundancy Check(순환 중복 검사), 데이터의 오류 확인

     

    - 청크의 종류

        -> 중요 청크 : 첫글자가 대문자 (IHDR, IDAT, PLTE, IEND)

        -> 보조 청크 : 첫 글자가 소문자

        *모든 PNG 파일에는 IHDR 청크와 IDAT 청크 IEND 청크가 들어있다. 

     

    [ IHDR ] PNG 파일의 기본 정보를 담고 있는 청크

    -  "Image Header"

    - 기본정보

        ->가로(Width, 4B)

        ->세로(Height, 4B)

        ->비트 깊이(Bit Depth, 한 픽셀이 차지하는 비트의 양, 1B)

        ->색 타입(Color Type, 색의 유형을 숫자로 나타낸 값, Alpha는 투명도, 1B)

    표에 주어지지 않은 상황의 이미지 데이터는 만들 수 없다. 예를 들면 Bit Depth가 4인 truecolor같은 경우는 만들 수 없다.

        ->압축 메소드(Compression method, 0 (Deflate) 한 가지, 1B)

        ->필터링 메소드(Filter method,  (Adaptive Filtering) 한 가지, 1B)

        ->인터레이스 메소드(Interlace method, 0 (No interlace), 1 (Adam7 interlace) 두 가지, 1B)

            ㄴ웹 페이지 등에 이미지를 표시할 때 이미지 로딩이 완료되기 전 먼저 해상도가 낮은 이미지를 보여주기 위하여 사용

     

    [ IDAT ] 실질적 이미지 데이터가 들어가는 부분

    - "Image Data"

    - 한 개의 PNG 파일은 여러개의 IDAT 청크를 가질 수 있는데, 이는 데이터를 스트리밍 방식으로 전송하기 위한 것

    - 하나의 IDAT 청크가 이미지의 특정 부분을 나타내는 것은 아니기 때문에 모든 IDAT 청크가 있어야만 이미지 디코딩을 정상적으로 할 수 있다

    - 원본 데이터가 필터링 메소드와 압축 메소드를 거친 후에 나온 것

    - 반대로 압축을 풀고 필터링을 해제하면 원본 데이터를 얻을 수 있다.

     

    [ PLTE ] 팔레트, 즉 색 공간을 표시하는 청크

    - IDAT 청크에서 PLET 청크의 색상 번호로 색을 표현

    -  Color Type 3에서는 색을 표시하기 위해 항상 PLTE 청크가 필요, color type 2또는 6에서는 선택적으로 필요

    - bit depth에 관계없이 한 샘플(색상 채널 ex. R, G, B, A)  8 비트를 사용

    - 팔레트 항목 수는 bit depth로 표현할 수 있는 범위를 초과하지 않는다.

     

    [ IEND ] 이미지의 맨 뒤에 위치하는 청크

    - 이미지 파일의 끝을 표시한다.

    - 아무 데이터가 없기에 길이는 0

     

    *출처 : https://eece-labs.tistory.com/2?category=794291, https://eece-labs.tistory.com/7?category=794291


    PNG파일의 구조에 대해서 알아보았습니다. 실직적인 이미지 데이터가 담긴 곳은 IDAT라는 것을 알 수 있습니다.

    Hxd에 IDAT를 검색해볼까요.

     

     

    한 군데가 IDAT가 소문자로 작성되어있네요.

    변경해주고 저장하고 다시 파일을 열어봅시다.

     

     

    HackCTF{c@n_y0u_$ee_m3?}를 찾을 수 있네요.

     

     

    정답!