machine learning, image

hack this site Programming missions : Analyze the picture and find the ascii code

qkqhxla1 2015. 1. 20. 15:50

https://www.hackthissite.org/missions/prog/2/




The pixels in the above image are numbered 0..99 for the first row, 100..199 for the second row etc. White pixels represent ascii codes. The ascii code for a particular white pixel is equal to the offset from the last white pixel. For example, the first white pixel at location 65 would represent ascii code 65 ('A'), the next at location 131 would represent ascii code (131 - 65) = 66 ('B') and so on.


The text contained in the image is the answer encoded in Morse, where "a test" would be encoded as ".- / - . ... -"


위에 이미지의 첫번째 줄은 0~99이고, 그다음 줄은 100~199 이런식으로 진행. 흰 픽셀은 아스키코드를 나타내며, 아스키코드 값은 바로 이전의 아스키코드 인덱스에서의 증가량이다. 예로 첫번째 픽셀이 65번째에 있으면 A이고, 그다음 픽셀이 131번째이면 131-65인 B이다. 나머지도 이와 같으며 이 값들은 모두 모스부호로 인코딩되어있다. 예로 a test는 ".- / - . ... -"로 인코딩 될 수 있다. 


결국 이미지에서 아스키값을 뽑아서 그걸 모스 부호로 디코딩한후 보내면 그게 답이다.


1. 이미지를 프로그래밍으로 다운로드

2. 이미지에서 아스키값을 뽑아서 디코딩.

3. 재전송.


# -*- encoding: cp949 -*-
import Image,urllib2
def download_photo(filename):
    file_path = "%s%s" % ("C:\\Users\\Ko\\Documents\\Visual Studio 2012\\Projects\\PythonApplication37\\", filename)
    downloaded_image = file(file_path, "wb")
    req = urllib2.Request('https://www.hackthissite.org/missions/prog/2/')
    req.add_header('cookie','PHPSESSID=쿠키')
    urllib2.urlopen(req).read()

    req = urllib2.Request('https://www.hackthissite.org/missions/prog/2/PNG/')
    req.add_header('cookie','PHPSESSID=쿠키')
    image_on_web = urllib2.urlopen(req)
    while True:
        buf = image_on_web.read()
        if len(buf) == 0:
            break
        downloaded_image.write(buf)
   
    downloaded_image.close()
    image_on_web.close()
    return file_path
encoding = {'A': '.-',     'B': '-...',   'C': '-.-.', 
        'D': '-..',    'E': '.',      'F': '..-.',
        'G': '--.',    'H': '....',   'I': '..',
        'J': '.---',   'K': '-.-',    'L': '.-..',
        'M': '--',     'N': '-.',     'O': '---',
        'P': '.--.',   'Q': '--.-',   'R': '.-.',
     	'S': '...',    'T': '-',      'U': '..-',
        'V': '...-',   'W': '.--',    'X': '-..-',
        'Y': '-.--',   'Z': '--..',
        
        '0': '-----',  '1': '.----',  '2': '..---',
        '3': '...--',  '4': '....-',  '5': '.....',
        '6': '-....',  '7': '--...',  '8': '---..',
        '9': '----.' 
        }
decoding = {} #decode dic
for key, val in encoding.items(): decoding[val] = key
download_photo('hack.png')
im = Image.open('hack.png')
pix = []
before = 0
for i in range(0,im.size[1]):
    cnt = 0
    for j in range(0,im.size[0]):
        if im.getpixel((j,i))==1:
            pix.append(i*100+cnt - before)
            before = i*100+cnt
        cnt += 1
morse = ''.join(map(chr, pix)).split(); answer = ''
for i in range(len(morse)):
    answer += decoding[morse[i]]
print answer

req = urllib2.Request('https://www.hackthissite.org/missions/prog/2/index.php','solution='+answer)
req.add_header('cookie','PHPSESSID=쿠키')
req.add_header('referer','https://www.hackthissite.org/missions/prog/2/')
print urllib2.urlopen(req).read()