Wargame/CTF

RACTF 2020: Dimensionless Loading, Disk Forensics Fun

마띠(쥔장) 2020. 6. 13. 04:22
Dimensionless Loading

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

 

Disk Forensics Fun

제공된 image.E01을 Autopsy에 넣어봤다.

일단, ROOT 파일부터 살펴봤다.

여기에서 PGP 파일을 볼 수 있었다.

PRIVATE.PGP: "BEGIN PGP PRIVATE KEY BLOCK"이라는 문자열로 시작하는 파일이다.

이번에는 PUBLIC.PGP

PGP 개인/공개키를 뜻하는 것 같은데 PGP가 뭔지를 모르겠다.

..그렇다고 한다.

그럼 PGP 개인키, 공개키가 있으니까 어떻게든 복호화는 가능할텐데 뭘 복호화는 아직 모른다.

그러다 HOME 파일에서 NOTHINGH.ASC 파일을 발견했다.

저게 뭔지도 모르지만 일단 "BEGIN PGP MESSAGE"로 시작하길래 이걸 복호화해야겠다는 생각을 했다.

복호화 프로그램은 아래에서 소개하는 GnuPG - Kleopatra를 사용했다.

 

파일 PGP 암호 해독

파일 PGP 암호 해독PGP Decrypt File 이 문서의 내용 --> 파일 PGP 암호 해독 작업은 사용자가 만든 PGP 키 파일 및 암호를 사용하여 전체 폴더 트리를 암호 해독합니다.The PGP Decrypt File activity decrypts a file

docs.microsoft.com

프로그램을 굳이 사용하지 않고 푸려면 아래 블로그 참고하세여

 

GPG 자료 암호화/복호화하기

이번 포스트에서는 자료를 암호화/복호화하는 방법을 알아보겠습니다. 앞선 포스트를 모두 따라했다면 현재 여러분의 키 링에는 적어도 본인의 개인키와 공개키가 들어 있을 것입니다. 친구나

stuffstuff.tistory.com

어쨌든!

Kleopatra에서 257-PRIVATE.PGP와 259-PUBLIC.PGP를 임포트하고 그 옆 Decrypt 메뉴를 통해 NOTHINGH.ASC를 넣어보자.

그러면 cloud@avalanche_midgar.org라는 이메일 인증서가 생기고

복호화가 완료되었다는 메시지를 볼 수 있다.

그렇게 생긴 파일을 HTML 파일로 바꿔주고 열어보자.

(조금 무서움)

오호..

빼곡한 문자&숫자가 사진을 이루고 있다. 

아스키 코드라고 생각했고 문자열로 변환했다.

플래그 발견!

728x90

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

InCTF 2020 Forensics_LOGarithm  (0) 2020.08.09
InCTF 2020 Forensics_Investigation  (0) 2020.08.02
IOLI crackme 0x00 ~ 0x05  (0) 2020.04.19
2020 AUCTF  (2) 2020.04.11
Codegate 2020  (1) 2020.04.02