보안 전공생의 공부

N0Named Wargame [A] 입사테스트[2] | PNG와 APNG 구조 본문

Wargame/web

N0Named Wargame [A] 입사테스트[2] | PNG와 APNG 구조

수잉 2021. 1. 15. 11:19

PNG : PNG 시그니처(8개의 바이트)와 일련의 청크들로 구성되어있다.

APNG : PNG 형식의 확장기능으로, 애니메이션으로 된 이미지에 대한 지원을 추가로 하는 형식이라고 한다.

청크 하나는 4개의 부분으로 이루어져있다.

길이(4바이트), 청크 유형(4바이트),청크데이터(길이 바이트), CRC(4바이트)

길이

(4 바이트)

청크 유형

(4 바이트)

청크 데이터

(길이 바이트)

CRC

(4 바이트)

최소한의 PNG인 경우IHDR(그림헤더) 청크, IDAT(그림데이터) 청크, IEND(그림 끝부분) 청크가 필요하다.

89 50 4E 47 0D 0A 1A 0A

PNG 시그너처

IHDR

그림 헤더

IDAT

그림 데이터

IEND

그림 끝부분

3개의 각각의 PNG 파일들로부터 animated된 PNG를 조합한 방법이다.

(출처 : APNG Specification - MozillaWiki ,

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

난이도 상이라고 표기된 이번주 과제의 마지막 ...

tweakpng 툴을 사용하라고 참조해주셨당

tweakpng 프로그램과 함께 다운로드 된 sample.png를 프로그램으로 열어보았다.

그런데 tweakpng는 jpg파일 형식은 지원을 안한다.

WinHex로 png파일 시그니처로 바꿔야될 것 같다.

헤더 시그니처가 jpg도 아닌, png도 아닌 걸로 되어있다.

PNG 헤더 시그니처, 푸처 시그니처

이를 png 헤더 시그니처인 89 50 4E 47 0D 0A 1A 0A로 수정해서 새로 저장해준다.

이렇게 png 형식으로 바꾸니 (확장자는 안 고쳐서 여전히 .jpg이지만)

검은 사진이 뜬다.

일단 TweakPNG로 이 파일을 열어보았다.

그런데 파일 끝에 쓰레기 값이 있다고 경고창이 뜬다 ..!

질문하였더니 뒤에 푸처 시그니처가 잘못된 것이라고 하였다.

생각해보니 푸처 시그니처를 변경하지 않았다.

기존의 푸처시그니처

뒤에 PNG 푸처 시그니처인 49 45 4E 44 AE 42 60 82

JPG 푸처 시그니처인 FF D9가 같이 있다.

수정 1

수정 2

뒤에 FF D9를 없애려고 앞에 PNG 푸처 시그니처를 요리조리 옮겨보았지만 계속 저 경고차이 떴다.

이것도 질문을 해보니 처음 상태에서 FF D9를 완전히 삭제하라고 한다.

삭제하는 건 생각도 못해서 00 00 으로 채우고 있었는데 쓰레기값이라 오류가 뜨는 것이라고 했다.

삭제는 지우려는 바이트 위에 오른쪽 마우스를 눌러서 Edit-Remove 해주면 된다 ㅎㅎ

수정 3 - 완료 :)

다시 TweakPNG를 열어보면 이제 경고창이 사라졌다.

파일상의 청크들이 뒤죽박죽 섞여있다.

File-Check Validity로 청크들을 올바른 순서로 나열하여 파일이 유효하게 만들어주었다.

기존 상태

수정후 ( IDAT 가 여러개 있을 경우, 크기가 큰 것부터 연달아 나열해주면 된다.)

이제 문제가 없다고 한다.

하지만 이미지 파일을 열어보면 딱히 별 다른 힌트를 얻을 게 없다.

이 이유에 대해 좀 고민해보면,

아까 이 PNG 파일의 청크들 중 APNG와 관련된 fcTL, fdAT 청크들이 있었다. 그래서 이 파일은 결국 PNG파일이 아닌 APNG파일인 것이다.

APNG는 여러 PNG파일로 만들어진 것이므로, 이 파일을 PNG파일로 쪼개보면 문제를 풀 수 있을 것이다.

먼저 푼 동기 언니가 APNG Disassembler 툴을 알려주었다.

이걸 이용해서 PNG파일로 쪼갤 수 있을 것이다.

출처 : http://apngdis.sourceforge.net/

그런데 위 사진을 참고하고 보니, animated.png와 내가 정리한 task.png의 청크들 순서가 약간 다른 것 같다.

Check Validity을 사용할 때는 tRNS가 IDAT 바로 앞에 있게 하였는데, IDAT 바로 앞에 있어야하는 것들은 acTL과 fcTL 청크들이였다.

그리고 뒤에 fcTL은 fdAT보다 앞에 있어야 한다.

다시 청크 순서를 수정해서 APNG Disassembler 을 이용해 PNG 파일로 쪼개보면

이렇게 두 개의 PNG파일이 나오고,

두번째 파일에서 플래그를 얻을 수 있다.

처음에 파일 쪼개기를 했을 때 PNG 파일이 하나만 나와서 약간 헤맸지만,

저장에 문제가 있었는지 다시 새로 Winhex 수정해서 저장하고 해보니

해결되었다 ..!

'Wargame > web' 카테고리의 다른 글

[SuNiNaTaS] #6  (0) 2021.01.20
[SuNiNaTaS] #2  (0) 2021.01.20
HackCTF #5 Guess me  (0) 2021.01.15
Lord of SQL Injection#6 darkelf  (0) 2021.01.15
Lord of SQL Injection#5 wolfman | White Space filtering  (0) 2021.01.15
Comments