728x90

▶포렌식 교육 1주차 3번 문제에 해당하는 [A] 입사 테스트[2] 문제 풀이에 관한 내용입니다!

 

N0Named Wargame은 써니나타스와 같은 워게임 사이트이다. 주소는 http://ctf.no-named.kr:1234/ 이다.

 

문제 풀이에 앞서 

해당 문제는 PNG 파일의 시그니처와 APNG 파일의 청크 구조를 알아야 풀 수 있는 문제이다.

 

이전 글에서 PNG 파일의 시그니처에 대해서 다뤘으니 넘어가도록 하겠습니다. 궁금하신 분들은

 

▶PNG 파일의 시그니처에 관한 내용과 문제는 https://bgm2020.tistory.com/3 에서 확인하실 수 있습니다.

 

 

PNG 파일은 파일의 시작 부분에 헤더 시그니처를 파일의 끝 부분에 푸터 시그니처를 가진다.

 

그러면, 그 사이에는 어떤 것들이 들어가 있을까?

 

바로 이미지를 구성하는 내용들이 담겨 있고, 그것들의 한 단위를 청크(Chunk) 라고 부른다.

 

다시 말해서, PNG 파일 구조는 파일 시그니처와 다양한 청크들로 이루어져 있다.

 

 


PNG 청크 (Chunk) 구조와 종류

 

청크(Chunk)는 중요 청크와 보조 청크로 크게 두 가지 종류가 있으며, 중요 청크는 앞 글자가 대문자 보조청크는 소문자이다.

 

청크의 기본적인 구조는 다음과 같다.

 

청크의 기본적인 구조, 출처: https://ko.wikipedia.org/wiki/APNG

 

struct Chunk {
  Length (4 bytes);
  Chunk type (4 bytes);
  Chunk data (Length bytes);  // 가변 길이 
  CRC (4 bytes);
}

위의 코드는 구조체와 비슷한 형식으로 표현해본 것입니다. 정확한 코드가 아니며, 이해를 돕기 위해서 작성한 것입니다.

 

  • Length는 청크 데이터의 길이에 관한 정보를 담고 있다.
  • Chunk type은 청크의 종류에 관한 정보를 담고 있다.
  • Chunk data는 실제 데이터가 들어가는 부분으로, 길이가 정해져 있지 않다.
  • CRC는 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식이다.

중요 청크: IHDR, IDAT, PLET, IEND 

보조 청크: tRNS, acTL, fcTL, fdAT, cHRM, qAMA, iCCP, sBIT, sRGB 등으로 매우 다양함.

 

중요청크의 경우 이름에 담겨진 의미 그대로 PNG 파일 구조에서 중요한 역할을 맡는다. 그래서, 기본적으로 PNG 파일에는 IHDR IDAT IEND가 들어간다. 

 

  • IHDR: Image Header의 약자이며, 시그니처 바로 뒤에 오는 청크로 넓이, 높이, 비트 수, 색 타입 등에 대한 정보가 담긴다. 

  • IDAT: Image Data의 약자로 이미지 데이터가 들어가는 부분으로 이미지는 여러 개의 IDAT 청크로 쪼개지며, 모든 IDAT 청크가 있어야 이미지 디코딩을 정상적으로 할 수 있다.

  • PLET: Palette의 약자로 색 공간을 표시한다. (color type 3에서는 항상 PLTE 청크가 필요하고, color type 2또는 6에서는 선택적으로 필요하며, color type 0또는 4에서는 필요하지 않다.) 

  • IEND: 이미지 끝을 의미하며, 맨 뒤에 위치하는 청크로 파일의 끝을 표시해준다.

 

더 자세한 내용이 궁금하다면 다음 사이트를 참조하세요.

https://ko.wikipedia.org/wiki/PNG

 

PNG - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 포터블 네트워크 그래픽스(Portable Network Graphics; PNG, [2][3])는 비손실 그래픽 파일 포맷의 하나이다. 특허 문제가 얽힌 GIF 포맷의 문제를 해결하고 개선하기 위해

ko.wikipedia.org

https://eece-labs.tistory.com/7?category=794291

 

[PNG] PNG 파일 구조의 이해 - 2

이번 포스트에서는 다양한 청크에 대해 알아보자. 청크의 종류는 중요 청크랑 보조 청크로 나누어진다.중요 청크는 맨 앞글자가 대문자이며, 보조 청크는 맨 앞글자가 소문자이기 때문에 쉽게

eece-labs.tistory.com


APNG

APNG(Animated Portable Network Graphics)는 PNG를 확장한 이미지 파일 포맷으로 GIF와 비슷한 방법으로 애니메이션을 구현하면서 기존 PNG 파일과의 하위 호환성을 유지했기 때문에 GIF보다 더 높은 품질을 보여 준다. 

 

(APNG에서는 보조 청크로 acTL, fcTL, fdAT 등이 사용된다.)

 

APNG의 구조는 다음 그림과 같다.

APNG의 구조 예시, 출처: https://ko.wikipedia.org/wiki/APNG

 

더 자세한 내용을 공부하고 싶다면 다음 사이트를 참조하세요.

 

https://ko.wikipedia.org/wiki/APNG

 

APNG - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 애니메이션 포터블 네트워크 그래픽스애니메이션 PNG (일부 웹 브라우저에서는 정적인 이미지로 표시됨)파일 확장자.png .apng발표일2008년 8월 4일 (12년 전)(2008-08-

ko.wikipedia.org

https://wiki.mozilla.org/APNG_Specification

 

APNG Specification - MozillaWiki

APNG 1.0 Authors: Stuart Parmenter Vladimir Vukicevic Andrew Smith Overview APNG is an extension of the PNG format, adding support for animated images. It is intended to be a replacement for simple animated images that have traditionally used the GIF forma

wiki.mozilla.org


 

 

 


 

이번 문제를 풀기 위해서 알아야 할 PNG 파일의 청크에 대한 설명이 끝났습니다.

 

여기까지 읽으신 분들은 힘을 내서 이제 문제를 풀러 가봅시다~!!

 

 

 

문제를 보면 다음과 같다.

 

 

입사 테스트로 이미지 파일 복구하는 문제가 나온 것 같다. 해당 파일을 다운 받아서 보도록 하자.

 

이미지 파일 열어본 모습

 

위의 사진과 같이 다운 받아서 열어 본 파일의 이미지가 제대로 보이지 않는다.

 

2번째 문제 풀이처럼 HxD 어플 통해서 내부에 어떤 문제가 있는지 확인해보자.

 


HxD

HxD(Hex Editor)는 파일의 원본 내용을 볼 수 있으며, 편집할 수 있는 기능을 가진 도구이다. 이름에 나타나 있는 것처럼 16진법으로 내용들이 표기가 된다. 

 

다음 사이트에서 HxD 툴을 설치할 수 있다. https://mh-nexus.de/en/downloads.php?product=HxD20

 

Downloads | mh-nexus

Downloads Note: Starting with HxD 2.3, the portable edition is available as separate setup program, and can be run with minimal privileges (no admin rights required). For the portable edition, the setup program writes only into the selected folder (e.g., U

mh-nexus.de


 

HxD로 본 파일의 첫 부분
HxD로 본 파일의 끝 부분

 

jpg 확장자라서 jpg 파일의 시그니처를 가지고 있을 것이라고 생각했는데, 헤더 시그니처가 PNG의 헤더 시그니처와 매우 유사하다!

 

또한, 푸터 시그니처에서 jpg 푸터 시그니처인 "FF D9"가 있지만 그 앞에 있는 데이터는 "49 45 4E 44 AE 42 60 82"로 PNG의 푸터 시그니처와 동일하다.

 

두 가지 사실을 종합해보면, jpg가 아닌 PNG 파일이었을 것으로 추정해볼 수 있다.

 

따라서 해당 파일의 헤더 시그니처와 푸터 시그니처 부분을 PNG 형식으로 편집해주면 다음과 같은 이미지를 얻을 수 있다.

 

알맞은 PNG 시그니처 형식으로 편집한 이후의 이미지 모습

 

그런데........ 이미지를 읽을 수 있지만, 검은색 이미지만 보인다. 

 

아마도 PNG 파일 내부를 구성하고 있는 PNG 청크들에게 어떠한 문제가 있어서 제대로 된 이미지를 볼 수 없는 것 같다.

 

청크에 어떤 문제가 있는지 확인하기 위해서 청크를 분석해주는 툴인 TweakPNG를 사용했다.

 


TweakPNG

TweakPNG는 PNG 파일을 청크 단위로 분석해주는 툴로, PNG 파일에 담겨 있는 청크들을 확인하고 편집할 수 있다.

 

다음 사이트에서 해당 툴을 설치할 수 있다.

http://entropymine.com/jason/tweakpng/

 

TweakPNG

TweakPNG TweakPNG is a low-level utility for examining and modifying PNG image files. It supports Windows XP and higher. In order to make much use of it, you will have to be at least somewhat familiar with the internal format of PNG files. For information

entropymine.com


 

 

 

분석한 결과 다음과 같다.

 

TweakPNG로 분석한 해당 파일의 청크 구조

 

 

해당 파일의 청크 구조를 분석해보자

 

 

우선 보조 청크로 fcTL이 들어가 있으며, APNG frame이라고 되어 있다. 즉, 이 파일은 APNG 파일인 것이다.

 

APNG 청크 기본 구조 사진은 맨 앞에 있지만 다시 설명해보자면,

 

기본적으로 PNG 시그니처, IHDR, acTL로 시작해서 

 

여러 보조 청크들과 fcTL, IDAT이 첫 번째 프레임이 된다. 

(acTL이 IDAT보다 앞에 있어야 APNG로 인식이 될 수 있다.)

 

※더불어 IDAT 앞에 단일 fcTL 청크가 존재함으로써 애니메이션의 첫 번째 프레임으로 포함될 수 있다. 

 

두 번째 프레임부터는 fcTL, fdAT 청크로 이루지는데,

 

fcTL과 fdAT에 있는 청크 시퀀스 번호 순으로 정렬되어야 한다.

 

다시 말해서 순서는 fcTL, fdAT 순으로 반복해서 두 번째, 세 번째... 프레임이 채워지는데 

 

이때, fcTL과 fdAT가 가지는 시퀀스 번호가 중복되거나 중간에 비면 안된다는 의미이다.

 

이를 바탕으로 위의 분석된 결과를 보면, 청크들의 순서가 엉망이란 것을 발견할 수 있다. 

 

1. APNG 파일로 인식되기 위해서는 acTL이 IDAT보다 위에 있어야 하는데, IDAT 아래에 있다. 

 

2. fcTL과 fdAT는 fcTL fdAT 순이며, 청크 시퀀스 번호 순으로 정렬되어야 하는데, 시퀀스 번호가 1인 fcTL이 시퀀스 번호가 2인 fdAT보다 아래에 있다.

 

해당 부분을 TweakPNG 툴을 이용해 올바르게 고쳐주면 다음과 같다.

 

acTL, fcTL 위치를 올바르게 고친 모습

 

이렇게 하면 끝인걸까?.... 아니다 아직 남은 부분이 있다.

 

바로 IDAT 부분을 확인해야 한다. PNG 파일의 경우 모든 IDAT 청크가 있어야 제대로 디코딩이 된다.

 

또한, IDAT 청크는 프레임 1에만 존재하고 두 개만 있는 경우에는 크기가 큰 것부터 정렬해서 순서를 맞춰볼 수 있다.

 

※하지만, 파일의 크기가 커짐에 따라서 IDAT 청크의 수가 많아지면 정확한 순서를 알기 위해서 모든 경우의 수를 고려해서 시도해봐야 한다.

 

올바르게 고치면 다음과 같다.

 

IDAT을 올바르게 정렬한 모습

자 이제, 올바르게 고쳐졌는지 File - Check Validity 기능을 통해서 확인해보자.

 

에러 메시지

 

tRNS의 위치가 문제 있다는 에러 메시지가 발생한다. 메시지 내용처럼 IDAT 보다 앞에 tRNS가 나오게끔 이동시켜준다.

 

tRNS를 올바르게 정렬한 모습

 

다시 Check Validity를 통해서 확인해 본 결과 아무 문제 없다고 확인된다~!!!

 

이렇게 복구된 이미지 파일을 열어보면 다음과 같다.

복구된 task1.jpg

 

검은색 이미지를 가지고 있던 파일이 원래는 이러한 이미지를 가진 파일이었다는 사실을 알 수 있다.

 

엇.... 근데 APNG 파일이면 GIF처럼 움직임이 있어야 하는데 아무런 생동감이 느껴지지 않는다....

 

복구된 해당 파일에는 문제가 없으나, 윈도우에서 지원하는 이미지를 열어보는 도구에서 APNG를 지원하지 않는다. 

 

이러한 경우 해결 방법은 크게 두 가지가 있다.

 

첫 번째는 APNG를 지원하는 환경에서 해당 이미지를 열어보는 것이다.

 

예시로 칼리 리눅스 환경에서 해당 파일을 Open With Other Application에서 Firefox를 통해서 열어보면 생동감 있게 키 값이 반짝이는 APNG 파일을 볼 수 있다.

 

두 번째는 APNG에는 여러 프레임의 PNG가 합쳐진 것이므로, APNG에서 PNG를 디스어셈블하는 방식이 있다.

 

http://apngdis.sourceforge.net/ 

 

APNG Disassembler

APNG Disassembler deconstructs APNG file into a sequence of PNG frames. Command line: apngdis anim.png [name] Decoding is implemented by parsing all chunks in the APNG file, remuxing them into a sequence of static PNG images, as shown in the diagram below,

apngdis.sourceforge.net

 

위의 사이트에서 APNG Disassembler 툴을 다운 받아서 APNG에 들어 있는 PNG 파일을 분리해낼 수 있다.

 

Disassemble하는 과정

 

 

이렇게 PNG 파일을 분리해내는 과정을 거치고 나면,

APNG에서 분리된 PNG 파일들 

 

다음과 같이 두 개의 PNG 파일이 나오며, 안에는 키 값이 담겨 있다.

키 값을 입력해주면, 문제가 해결된다!!!

 

해결된 문제!!!

 

 

 

이렇게 긴 과정을 통해서 문제를 해결할 수 있었다~!!!

 

APNG 청크 구조와 PNG 파일의 시그니처에 대한 개념을 정확히 알고 그것들을 분석할 수 있는 툴을 사용할 수 있는지 확인하는 포렌식 문제였다.

 

728x90