위와 같은 사진이 있다. 사진의 파일명은 evil1.jpg(응? 왜 1이지? 점 심나 가서 먹을 거 같아) 웹상에서 상호작용은 특별히 없는 것 같으니 주석을 확인해 보자
title이 dealing evil이다. 돌린다는 것에 이번문제를 해결할 key가 있는 거 같다.
해결 아이디어
사진이름에 이상함을 느끼자 evil1.jpg가 있다는 것은 evil2.jpg도 있다는 것이다. 아래는 evil2.jpg를 요청한 결과이다.
gfx로 다운로드하라고 한다. evil2.gfx를 요청하면 파일을 다운로드할 수 있다. gfx라는 확장자는 애니메이션 파일이지만 문제에서는 이를 표현하고자 한 것은 아닐 것이다. 파일을 hxd로 뜯자
잘 보면 헤더에 간격이 띄워진 상태로 JFIF 등의 문자열이 있는 것을 확인할 수 있다. evil1.jpg에서 5등분이 난 카드처럼 우리도 바이트를 5개로 나누어보자 아래는 구현 코드이다.
### 12.py
if __name__=="__main__" :
with open("evil2.gfx","rb") as img :
data = img.read()
for i in range(5) :
with open(str(i)+".dat","wb") as f:
f.write(data[0+i::5])
오호 잘 쪼개졌다. 헤더 확인 결과 각각의 폴더는 다음의 확장자를 가진다.
0.dat : jpg
1.dat : png
2.dat : gif
3.dat : png
4.dat : jpg
사진을 첨부하고 싶은데 알올라간다. 삭선 되어있는 4.jpg를 제외하면 글자는 disproportional이다. 찾았다.
그림 한 장이 있다. 파일명은 cave.jpg이고 hxd로 확인해보고 웹에서 클릭을 해봐도 상호작용은 없다. 페이지 소스를 보도록 하자
골 때린다. 아무것도 없다.
해결 아이디어
문제 이름이 odd, even이다. 그럼 그림의 홀수번째 픽셀과 와 짝수번째 픽셀을 나누면?? 이거 가능하겠다는 생각이 들었다. 아래는 구현 코드이다.
### 11.py
from PIL import Image
if __name__=="__main__" :
with Image.open("cave.jpg") as img :
odd_img = Image.new('RGB',img.size)
even_img = Image.new('RGB',img.size)
for y in range(img.height) :
for x in range(img.width) :
if((x+y)%2==0) :
even_img.putpixel((x,y),img.getpixel((x,y)))
else :
odd_img.putpixel((x,y),img.getpixel((x,y)))
odd_img.save("odd_image.png")
even_img.save("even_image.png")
다음과 같은 두개의 그림을 가질 수 있다.
<odd_image.png --- even_image.png>
even Image의 우측 상단을 자세하게 보면 evil이라는 글자 열이 쓰여있다. 찾았다.
사진 하나 있다. 가운데 무슨 바코드 같이 White~Black의 그림이 있는 게 특징인 거 같다.
해결 아이디어
White~Black의 색깔은 특징적으로 (R, G, B)값이 모두 같은 (N, N, N)을 가지고 있다는 특징이 있다.
아마 일렬로 있는 저 긴 사각형의 정사각형으로 나뉜 N들의 ASCII변환값에 힌트가 있지 않을까? 우선 해당 아이디어를 코딩해보았다.
### 7.py
from PIL import Image
import numpy
if __name__=="__main__" :
with Image.open("oxygen.png","r") as img :
pix = numpy.array(img)
y = img.height//2
ans = ""
### 단위사격각형 가로 크기가 7인건 그림판으로 쟀다
for x in range(0,img.width,7) :
ans += chr(pix[y][x][1])
print(ans)
출력결과는 다음과 같다.
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]n\S
잘 찾은거 같으니 나온 배열을 다시 ASCII화 해보자
### 7_1.py
if __name__=="__main__" :
base = [105, 110, 116, 101, 103, 114, 105, 116, 121]
ans = ''.join([chr(x) for x in base])
print(ans)