CTF/MISC

[D^3CTF] d3gif - MISC / PIL

SecurityMan 2023. 5. 29. 11:00

 

git 파일과 관련된 스테가노그래피 문제

 

포렌식 느낌인데 MISC 로 분류되었다.

 

MISC는 miscellaneous의 약자로 여러가지 잡다한 이라는 의미를 가지고 있다.

 

반응형

 

 

문제에서 주어지는 (x,y,bin).gif 파일은 이렇게 생겼다.

 

자세히 보면

 

뒷 배경의 색깔이 계속 바뀌는데

 

여기에 뭔가 숨겨진 메세지가 있을거라고 생각했다.

 

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

PIL은 Python Imaging Library의 약자로

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


pip install image

pip install pillow

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

 

from PIL import Image, ImageSequence

path = "./gg.gif"
img = Image.open(path)
iter = ImageSequence.Iterator(img)

index = 0

for frame in iter:
    frame.save('./split/{0}.png'.format(index))
    index += 1
    print(index, "created")

 

우선 gif 파일을 프레임 단위로 쪼개보기로 했다.

 

ImagSequence 를 사용하면 이렇게 이미지를 분리할 수 있다.

 


실행시켜보니 

 

이미지가 무려 1089개 생성되었다..

 

 

이렇게 배경색이 미묘하게 다른 이미지들이 1089개 생성된다.

 

1089는 아마 새로 생성되는 이미지의 크키와 관련있을 것이다.

 

 

33 * 33 이 1089 인걸 보아

 

생성해야할 이미지의 크기가 33 * 33 이라고 추측할 수 있다.

 

다음으로 어떻게 생성할 것인가인데,

 

문제파일의 이름이 (x,y,bin).gif 인걸 생각해봤을때

 

배경색 픽셀의 r, g, b 값을 추출한 뒤,

 

r 값을 x 좌표,

 

g 값을 y 좌표,

 

b 값을 뭔가 판단할 수 있는 기준으로 삼으면 될 것 같았다.

 

 

시험삼아 rgb 값을 추출해보면

 

b 값은 0 또는 1로만 구성되어 있는것을 알 수 있다.

 

from PIL import Image, ImageSequence

new_img = Image.new('RGB',(33,33))

for i in range(1,1089):
	img = Image.open('./split/{0}.png'.format(i))
	r,g,b = img.getpixel((1,1))

	if b == 0:
		new_img.putpixel((r,g),(0,0,0))
	else:
		new_img.putpixel((r,g),(255,255,255))

new_img.save('./flag.png')

 

알아낸 사실을 토대로 파이썬으로 코드를 작성했다.

 

1, 1 위치의 픽셀을 가져와

 

r, g, b 값을 추출한 뒤

 

새로 만든 이미지에

 

r, g 좌표에 b 값을 기준으로 색칠해줬다.

 

 

코드를 실행시키면 이렇게 작은 QR 코드가 하나 나온다.

 

 

온라인 스캐너에 넣으면

 

이렇게 플래그를 찾을 수 있다.

반응형