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 코드가 하나 나온다.
온라인 스캐너에 넣으면
이렇게 플래그를 찾을 수 있다.
'CTF > MISC' 카테고리의 다른 글
[Really Awesome CTF] Missing Tools - MISC / Jail Escape (69) | 2023.06.09 |
---|---|
[HackingCampCTF] plus minus - MISC / Pwntool (78) | 2023.06.07 |
[D^3CTF] d3readfile - MISC / locate (71) | 2023.05.27 |
[angstromCTF] Physics HW - MISC / Zsteg (66) | 2023.05.25 |
[angstromCTF] Simon Says - MISC / Python (72) | 2023.05.18 |