워게임/CTFlearn

[CTFlearn] Smiling ASCII - 포렌식 / HxD / PIL

SecurityMan 2023. 3. 1. 11:00

 

CTFlearn의 일흔 다섯번째 문제

 

이번엔 Medium 난이도의 포렌식 문제이다.

 

반응형

 

문제에서 주어지는 파일은 smiling.png 파일이다.

 

뭔가 묘하게 기분나쁘게 생겼다.

 

 

해당 파일을 HxD 도구를 이용해 열어본다.

 

파일이 89 50 4E 47 으로 시작하는것을 알 수 있다.

 

 

89 50 4E 47로 시작하는것은 PNG 파일의 특징이다.

 

이런걸 파일 시그니처 라고 한다.

 

 

이번엔 HxD에서 스크롤을 내려 파일의 끝으로 이동해 봤다.

 

PNG 파일은 끝날때 49 45 4E 44 AE 42 60 82 로 끝난다.

 

IEND®B`‚ 이렇게 생긴 문자열이 나오면 PNG 파일은 끝난것이다.

 

그런데 이상한게 위의 문자열이 나왔음에도

 

뒤에 Base64 인코딩된듯한 데이터가 더 있는것이 보였다.

 

 

CyberChef(https://gchq.github.io/CyberChef) 에서 해당 값을 디코딩해봤다.

 

이번 문제의 힌트가 되는 말이 나왔다.

 

pixel 이 ASCII 테이블처럼 0에서 255 사이의 값을 갖는걸 알고 있냐고 물어보고 있다.

 

픽셀의 RGB 값에 플래그가 숨어있다는 의미인듯 했다.

 

 

힌트를 보고 나서 다시한번 사진을 자세히 보니

 

사진의 왼쪽 윗부분 첫번째 픽셀들이 색깔이 이상한게

 

여기에 데이터가 숨겨져 있을거라고 생각했다.

 

문제는 Python PIL 라이브러리를 이용해서 풀었다.

PIL은 Python Imaging Library의 약자로

파이썬으로 이미지 처리를 할 수 있도록 해주는 라이브러리이다.

 


pip install image

pip install pillow

두 명령어를 이용해서 다운로드 받아주면 된다.

 

from PIL import Image

img = Image.open('smiling.png').convert('RGB')

xlen = 383
ylen = 300

flag = ''

for y in range(ylen):
	for x in range(xlen):
		r,g,b = img.getpixel((x,y))
		if x % 383 == 0:
			flag += chr(g)

print(flag)

 

smiling.png 파일을 불러온 뒤

 

가로줄의 첫 픽셀마다 RGB 값을 추출해서

 

그중 G값을 ASCII 코드로 바꿔 출력하는 코드이다.

 

 

해당 코드를 실행시키면

 

플래그가 출력되는것을 볼 수 있다.

반응형