-
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]
코드는 이 분을 참고했다.
zlib 라이브러리의 crc 32를 사용한 코드의 결과 값
width는 0x0562, height는 0x016b라고 한다.
그럼 수정해보자.
그러고 나니 파일에서 플래그를 볼 수 있었다.
여기서 PNG 정보를 볼 수 있다 CRC 계산 코드도 있다..
참고 사이트:
'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