-
0615 RACTF 2020: Dimensionless Loading2020/Write-Ups 2020. 6. 13. 05:54
수욜 강정윤
250점 짜리 문제!
flag.png 파일이 주어지고 열면 '이 파일을 열 수 없습니다'라고..
HxD로 까봤다. 일단 시그니처 관련해서는 아무 이상 없었다.
한 가지 이상한 점은, 사진 크기를 결정하는 부분이다.
핑크 부분은 width, 보라색 부분이 height를 결정한다.
조금 더 쉽게 보기 위해 010 에디터로 열어보자.
이 곳은 IHDR 청크에 해당하는 부분이다.
(조만간 png 파일 구조에 관한 포스팅 올려야지)
IHDR은 Image HeaDeR의 약자로, PNG 파일의 기본 정보를 담는 청크다.
width, height 모두 '0'이다.
요 부분이당
그래서 사진 크기를 바꿔야겠다는 생각을 했다.
먼저 width와 height 모두 0x0200으로 변경해봤다.
그랬더니 '열 수 없'었던 파일을 열 수 있었고 위와 같은 그림이 나왔다.
이제 됐으니 어떻게든 가로 세로만 잘 조정하면 되겠다고 생각했다.
CRC에서 그 값을 알 수 있었다.
CRC는 Cyclic Redundancy Check(순환 중복 검사)의 약자로, 데이터의 오류가 있는지 확인하는 부분이다.
IHDR의 CRC에서는 이 PNG의 가로, 세로 값을 알 수 있다.
이 부분이 CRC, 이 파일의 CRC 값은 0x5B8AF030이다.
from zlib import crc32 data = open("flag.png",'rb').read() index = 12 #IHDR chunk가 시작되는 인덱스 IHDR = bytearray(data[index:index+17]) #IHDR 시작부터 CRC 전까지의 범위 width_index = 7 #width 부분의 세 번째 바이트 인덱스 height_index = 11 #height 부분의 세 번째 바이트 인덱스 for x in range(1,2000): height = bytearray(x.to_bytes(2,'big')) #to_bytes(length, byteorder, *, signed=False) for y in range(1,2000): width = bytearray(y.to_bytes(2,'big')) for i in range(len(height)): IHDR[height_index - i] = height[-i -1] for i in range(len(width)): IHDR[width_index - i] = width[-i -1] if hex(crc32(IHDR)) == '0x5b8af030': #crc 값 print("width: 0x{}, height: 0x{}".format(width.hex(),height.hex())) for i in range(len(width)): IHDR[width_index - i] = bytearray(b'\x00')[0]
코드는 이 분을 참고했다.
W3rni0/RACTF_2020
Writeup for the challenges in Really Awesome CTF 2020 - W3rni0/RACTF_2020
github.com
zlib 라이브러리의 crc 32를 사용한 코드의 결과 값
width는 0x0562, height는 0x016b라고 한다.
그럼 수정해보자.
그러고 나니 파일에서 플래그를 볼 수 있었다.
여기서 PNG 정보를 볼 수 있다 CRC 계산 코드도 있다..
Portable Network Graphics (PNG) Specification (Second Edition)
This document describes PNG (Portable Network Graphics), an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. Indexed-c
www.w3.org
참고 사이트:
[PNG] PNG 파일 구조의 이해 - 2
이번 포스트에서는 다양한 청크에 대해 알아보자. 청크의 종류는 중요 청크랑 보조 청크로 나누어진다.중요 청크는 맨 앞글자가 대문자이며, 보조 청크는 맨 앞글자가 소문자이기 때문에 쉽게 �
eece-labs.tistory.com
PNG 파일 구조
최근 GoN 2018 신입생 리쿠르팅 문제나, pragyan CTF등의 대회에서 PNG 파일 구조를 조작해둔 포렌식 문제를 종종 봤는데, 그러한 문제들을 푸는 과정에서 공부한 PNG 파일 구조를 정리해보았다.
ryanking13.github.io
'2020 > Write-Ups' 카테고리의 다른 글
0615 Suninatas 28번 (0) 2020.06.13 0615 Suninatas 18번 (0) 2020.06.13 0615 RACTF 2020 Disk Forensics Fun (0) 2020.06.13 0615 [DigitalForensic]with CTF #12-이 파일에서 플래그를 찾아라!100 (0) 2020.06.13 0615 [DigitalForensic]with CTF #20 - 저는 이 파일이 내 친구와...100 (0) 2020.06.12