Python/2.7 simple coding(+ c++)

Security Override Programming 11~12

qkqhxla1 2014. 12. 23. 16:21

캡챠를 프로그래밍적으로 인식해서 제한된 시간안에 보내면 성공이다.


이전 글에서 pytesser을 언급했었는데 그때 풀어보려고 했었는데 풀라고 나온 캡챠가 너무 작아서


그냥 포기했었다. 우연찮게 돌아다니다가 http://kthan.tistory.com/176 요 글을 보았는데.


요 글에서는 캡챠를 인식하기 쉽게 변형하는 부분이 맨 아래에 나오는데 나도 이걸 보고 생각을 


해봤다. 글자가 너무 작아서 인식하기 어려우면 글자를 크게 하고, 인식하기 쉽게 픽셀을 변경해주면


될거같은데? 라고 생각해서 PIL공식 홈페이지에서 이것저것 찾아서 시도해봤더니 됬다.


내가 한 작업은.


1. 이미지를 받아온다.


2. 이미지를 보정한다. 이미지 크기를 늘리고, 글자가 있는 부분의 픽셀진하게, 글자가 없는 부분의

픽셀은 그냥 검은색으로 칠한다.


3. pytesser로 인식해본 뒤에 잘 인식 못하는 글자는 또 수동으로 바꿔준다.


4. 이렇게까지 보정해줬는데 종종 한글자씩 제대로 인식 못할때가 있다.(다른곳에서는 잘 인식하는데 유독 한곳씩 틀림.) 그냥 우연이라고 생각하고 될때까지 WHILE문으로 무한공격했다.




위에가 보정한 캡챠고, 아래는 인식한 캡챠. 노란색 박스부분에서 보이듯이 0이 H로 인식되었다.


다른곳에서는 0을 잘 인식하는것을 볼 수 있음... 0 말고도 다른곳이 한두군데 틀릴 때가 있다.


소스.


# -*- encoding: cp949 -*-
from pytesser import *
import urllib2,Image

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('http://securityoverride.org/challenges/programming/11/php_captcha.php')
    req.add_header('Cookie','쿠키')
    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

req = urllib2.Request('http://securityoverride.org/challenges/programming/11/index.php') #한번 접속한다. 한번 접속해야 이미지를 다운받고 요청을 보낼수 있는것같다.
req.add_header('Cookie','쿠키')
urllib2.urlopen(req).read()

while 1: #pytesser가 제대로 인식을 하다가 한글자씩 틀리는 경우가 종종 있다. 전부 다 맞을때까지 계속 보냈다.
    print 'download...'
    download_photo('captcha.png') #http://securityoverride.org/challenges/programming/11/php_captcha.php에서 이미지를 받아와서 captcha.png로 저장한다.
    im = Image.open('captcha.png') #받아온 이미지를 열어서

    x=3
    im.transform((500*x,20*x),Image.EXTENT,(0,0,500,20)).save('captcha.png') #보정. 받아온 이미지 크기는 500*20인데, 이걸 늘려준다.
    #첫번째 인자는 500*20의 크기를 몇배로 늘려줄건지 x로 정해놓았다. 3배 정도가 딱 적당하였다. 두번째인자는 늘린다는 flag인 Image.EXTENT, 세번째 인자는 좌료 0,0부터 500,20까지 늘린다는 소리이다. 
    #마지막의 .save()함수는 저장하는 함수이다. 늘린다음 저장.
    im = Image.open('captcha.png') #이미지를 다시 열어서
    for i in range(0,im.size[1]):  #이미지 전체 픽셀만큼 반복하면서
        for j in range(0,im.size[0]):
           if im.getpixel((j,i))[1]<100: #100보다 명도가 낮으면.
               im.putpixel((j,i),0) #그냥 0으로 검게 색칠.
           else:
               im.putpixel((j,i),1500) #글자가 있으면 1500으로 빨갛게칠함. 1500이 왜 빨간색인지는 모르겠다. 흰색 찾고싶었는데 흰색이 없음.
    im.save('captcha.png') #저장
    im = Image.open('captcha.png') 
    str = image_to_string(im) #보정된 이미지값을 열어서 pytesser로 캡챠인식해본다. 아래의 replace한거는 원래 7인데 F로 인식해서 F를 7로 바꾸고... 이런식으로 다 바꿈.
    str = str.replace('F','7')
    str = str.replace('q','a')
    str = str.replace('$','f')
    str = str.replace('@','9')
    str = str.replace('?','7')
    str = str.replace('S','8')
    str = str.replace('i','1')
    str = str.replace('t','c')
    str = str.replace('B','6')
    str = str.replace('l','1')
    str = str.replace('%','f')
    str = str.replace('E','2')
    str = str.replace('070','0f0')
    str = str.rstrip()

    print str
    req = urllib2.Request('http://securityoverride.org/challenges/programming/11/index.php','CSRF_TOKEN=%3C%3Fphp+echo+%24_SESSION%5B%27CSRF_TOKEN%27%5D%3B%3F%3E&string='+str+'&submitbutton=+Time+Has+Expired+')
    req.add_header('Cookie','쿠키')
    read = urllib2.urlopen(req).read()
    
    if read.find('Error') == -1:
        print read
        break


12.

(C+U+B+E+D)^3= CUBED 에 만족하는 값을 찾으라는데..... 출제자가 이제 문제 만들기 싫어졌는지


난이도와 질이 확 떨어짐.


for C in range(1,9):
    print C
    for U in range(1,9):
        for B in range(1,9):
            for E in range(1,9):
                for D in range(1,9):
                    if (C+U+B+E+D)**3==(10000*C + 1000*U + 100*B + 10*E + D):
                        print C,U,B,E,D
                        exit(0)


17576;