캡챠를 프로그래밍적으로 인식해서 제한된 시간안에 보내면 성공이다.
이전 글에서 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;
'Python > 2.7 simple coding(+ c++)' 카테고리의 다른 글
WeChall Training: Programming 1, Flow Over Astronomy (0) | 2015.01.04 |
---|---|
lob gremlin->cobolt (4) | 2014.12.31 |
Security Override Programming 10 (0) | 2014.12.18 |
Security Override Programming 9 (0) | 2014.12.18 |
Security Override Programming 8 (0) | 2014.12.18 |