Python/2.7 simple coding(+ c++)

Security Override Programming 1~3

qkqhxla1 2014. 12. 17. 19:05

level 1.


import urllib2,re

req = urllib2.Request('http://securityoverride.org/challenges/programming/1/index.php')
req.add_header('cookie','PHPSESSID=쿠키')

str = re.findall("<code style="white-space:nowrap">\s*(.*?)\s*</code>",urllib2.urlopen(req).read())[0]
after = str[1:]
str = str[0]+after[::-1]

req = urllib2.Request('http://securityoverride.org/challenges/programming/1/index.php','CSRF_TOKEN=%3C%3Fphp+echo+%24_SESSION%5B%27CSRF_TOKEN%27%5D%3B%3F%3E&string='+str)
req.add_header('cookie','PHPSESSID=쿠키')
read = urllib2.urlopen(req).read()
print read


소스를 복붙하면 문법에러가 뜰텐데 'white-space:nowrap' 으로 홑따옴표이다. 신텍스 하이라이터가 


"사이에 '를 쓰면 지맘대로 변환한다 '로 바꾸면됨


그냥 이런식으로 문자열을 가져와서 첫번째 글자만 빼고 역순으로 이은다음 보내주면 되는데,


종종 실패했다는 메시지가 뜬다.


문자열 가져와서 가공하는 부분은 아무리 살펴봐도 제대로 가져와서 가공한 것 같은데...


이유를 삽질해가면서 찾아봤지만 역시나 추측되는건 남은 시간이다. 


그래서 시간을 보내는 부분을 아예 빼버리고보냈다... 


(전송시 원래는 submitbutton=4+seconds+to+Submit 과 같은 형식으로 남은 시간도 보내진다.)



level 2.


import urllib2,re

req = urllib2.Request('http://securityoverride.org/challenges/programming/2/index.php')
req.add_header('cookie','PHPSESSID=쿠키')

strs = re.findall("<code style='white-space:nowrap'>\s*(.*?)\s*</code>",urllib2.urlopen(req).read())[0]
sum = 0
for i in range(len(strs)):
    sum += ord(strs[i])

req = urllib2.Request('http://securityoverride.org/challenges/programming/2/index.php','CSRF_TOKEN=%3C%3Fphp+echo+%24_SESSION%5B%27CSRF_TOKEN%27%5D%3B%3F%3E&string='+str(sum))
req.add_header('cookie','PHPSESSID=쿠키')
print urllib2.urlopen(req).read()


각각을 아스키코드값으로 변환해서 그 합을 보내면 된다. 1번과 별차이는 없어서 별로 설명할게 없다.


다만 2번은 1번처럼 시간 값을 바디에 넣어서 보내지 않았음에도 10번정도 실행시켜봤는데 다 성공하는


것으로 보아 1번의 문제점은 문자열의 가공부분 어딘가.... 라고만 추측된다.



level 3.


# -*- coding: euc-kr -*-
import urllib2,re
req = urllib2.Request('http://securityoverride.org/challenges/programming/3/list.txt')
req.add_header('cookie','PHPSESSID=쿠키')
dic = urllib2.urlopen(req).read().split(', ')
 
print dic
dictonary = [{} for i in range(0,len(dic))] #사전을 단어 갯수만큼 만듬. dic의 갯수가 224개.
for i in range(0,len(dic)):
    count = [0 for k in range(0,60)] #A~Z, a~z, (,)까지 갯수를 셀 리스트. 그냥 넉넉하게 60개 만들었다.
    for j in range(0,len(dic[i])): #한단어의 한문자씩 돌아가면서 카운트
        if dic[i][j]!=' ':
            count[ord(dic[i][j])-65] += 1
    for j in range(0,58):
        dictonary[i][chr(j+65)]=count[j]
#dictonary에는 keywords.txt의 각 단어에 각각의 문자가 몇개 들어있는지 사전파일로 저장되어있다. 224개의 단어에 대한 사전파일이 들어가있음.
 
req = urllib2.Request('http://securityoverride.org/challenges/programming/3/index.php')
req.add_header('cookie','PHPSESSID=쿠키')
page = urllib2.urlopen(req).read()
page = re.findall("<code style='white-space:nowrap'>\s*(.*?)\s*</code>",page)[0].split(', ')
print page

scramble = [{} for i in range(len(page))] #페이지의 단어 갯수만큼 사전을 만듬.
for i in range(0,len(page)): #위와 비슷한 알고리즘.
    count = [0 for k in range(0,60)]
    for j in range(0,len(page[i])):
        if page[i][j]!=' ':
            count[ord(page[i][j])-65] += 1
    for j in range(0,58):
        scramble[i][chr(j+65)]=count[j]
 
answer = []
for i in range(len(scramble)): #섞인 단어 개수만큼 반복하면서
    for j in range(0,len(dic)): #사전파일의 단어를 섞인 단어와 한개씩 비교한다.
        for k in range(0,58): #각각 문자 개수가 맞는지 비교.
            if scramble[i][chr(k+65)]!=dictonary[j][chr(k+65)]: #서로 틀리면 그냥 끝냄.
                break
            elif k==57: #똑같으면 answer리스트에 추가함.
                answer.append(dic[j])
print answer,'\n'
strs = ', '.join(answer)

req = urllib2.Request('http://securityoverride.org/challenges/programming/3/index.php','CSRF_TOKEN=%3C%3Fphp+echo+%24_SESSION%5B%27CSRF_TOKEN%27%5D%3B%3F%3E&string='+strs+'&submitbutton=+Time+Has+Expired+')
req.add_header('cookie','PHPSESSID=쿠키')
print urllib2.urlopen(req).read()


비슷한 문제를 두번이나 풀어봤으므로 해당 문제 링크만 걸고 개선된 코드만 올림. 해당 링크의


알고리즘을 그대로 가져왔기 때문에 주석이 이상할수 있다. 근데 이번에 하면서 또 발견한게..


시간부분을 그냥 만료된 상태로 보내도 해당 시간 이내에 보낸 답이 맞으면 맞다고 나온다. 


즉 첫번째문제는 내가 뭔가 잘못했다는건데...... 에이 몰라



'Python > 2.7 simple coding(+ c++)' 카테고리의 다른 글

Security Override Programming 6~7  (0) 2014.12.17
Security Override Programming 4~5  (0) 2014.12.17
Net-Force Programming 4~5,6?  (0) 2014.12.03
Net-Force Programming 1~3  (0) 2014.12.01
webhacking.kr 31  (0) 2014.11.30