본문 바로가기

#WarGame/Python Challenge

Python Challenge # LV.7 (픽셀 문자열)

반응형

출처) http://www.pythonchallenge.com/index.php

 

The Python Challenge

What people have said about us: "These sorts of things are in my opinion the best way to learn a language.", brberg at Media Cloisters "It's the best web site of the year so far.", Andy Todd at halfcooked "Addictive way to learn the ins and outs of Python.

www.pythonchallenge.com

 

http://www.pythonchallenge.com/pc/def/oxygen.html

[그림1. oxygen.png]

 

  • 파이썬 챌린지 레벨7 문제!
  • 이번문제는 위의 사진 하나 뿐이다.
  • 페이지소스에 title에 smarty라고 적혀있다. 

 

  • 이미지를 자세히 보니 가운데에 픽셀로 된 회색이 보인다.
  • CTF-d에서 비슷한 문제가 있었다. PIL (Python Image Library)로 푸는 문제인 것 같다.

 

[그림2. 이미지 크기]

 

  • 이미지 크기를 출력해보니 너비는 629, 높이는 95가 나온다.
  • 높이가 가운데에 회색 픽셀이 있는 것으로 보여 높이 47에서 픽셀값을 출력해보았다.

 

[그림3. 높이/2  픽셀 값 출력]

 

  • 몇가지 숫자들이 줄지어 출력되는 것을 볼 수 있다.
  • 너비도 629까지가 아니라 끝에서 10번째까지가 반복한다.
  • 보통 픽셀을 문자로 바꾸는 문제들이 많다.
  • 이번 문제도 출력된 픽셀 값들 중 반복되는 것만 문자열로 바꾸어 출력해보았다.

 

 

[그림4. 픽셀->문자열]

 

  • smar guy ~~~라고 적혀 있는 것 같다.
  • s는 5번 반복되고, m부터 출력된 문자 끝까지는 7번 반복된다.

 

[그림5. 문자열 출력]

 

range(start, stop, step)
     - start : 시작
     - stop : 끝
     - step : 증가값

  • 0부터 629까지 7만큼 건너 뛰면서 출력, 단 r,g,b 픽셀 값이 같을 때만
  • 이렇게 구현하여 출력해보면 다음 레벨이 무엇인지 힌트를 알려준다.
  • the next level is 다음 괄호 안의 숫자를 다시 문자열로 바꾸는 게 답인 것 같다.

 

[그림6. 최종 결과]

 

 

from PIL import Image
import re

image = Image.open("D:/Python Challenge/oxygen.png")
result=''
 
for x in range(0,image.size[0],7):
    pixel=image.getpixel((x,47))
    if pixel[0]==pixel[1]==pixel[2]:
        result+=(chr(pixel[0]))
print(result)

print ("".join(map(chr, (map(int, re.findall("\d+", result))))))

# re모듈을 이용하여 출력된 문자열에서 숫자만 따로 뽑아서 문자열로 한 번에 출력하는 방법도 있다. 

 

 

 

 

 

반응형

'#WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge # LV.9 (ImageDraw)  (0) 2020.09.01
Python Challenge # LV.8 (BZ2)  (0) 2020.09.01
Python Challenge # LV.6 (ZipFile)  (0) 2020.08.24
Python Challenge # LV.5 (pickle)  (0) 2020.08.20
Python Challenge # LV.4  (0) 2020.08.18