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]
코드는 이 분을 참고했다.
zlib 라이브러리의 crc 32를 사용한 코드의 결과 값
width는 0x0562, height는 0x016b라고 한다.
그럼 수정해보자.
그러고 나니 파일에서 플래그를 볼 수 있었다.
여기서 PNG 정보를 볼 수 있다 CRC 계산 코드도 있다..
참고 사이트:
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를 사용했다.
프로그램을 굳이 사용하지 않고 푸려면 아래 블로그 참고하세여
어쨌든!
Kleopatra에서 257-PRIVATE.PGP와 259-PUBLIC.PGP를 임포트하고 그 옆 Decrypt 메뉴를 통해 NOTHINGH.ASC를 넣어보자.
그러면 cloud@avalanche_midgar.org라는 이메일 인증서가 생기고
복호화가 완료되었다는 메시지를 볼 수 있다.
그렇게 생긴 파일을 HTML 파일로 바꿔주고 열어보자.
(조금 무서움)
오호..
빼곡한 문자&숫자가 사진을 이루고 있다.
아스키 코드라고 생각했고 문자열로 변환했다.
플래그 발견!
'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 |