Python/2.7 simple coding(+ c++)

Enigmagroup missions/programming 5

qkqhxla1 2014. 11. 5. 19:34

4번은 지식이 부족해서인지 잘 모르겠다. 나중에 다시 풀어봐야겠다.


5번은 이상한 언어가 중간에 있고 실행시마다 바뀐다. 미션은 이 코드를 분석해서


그 분석한 결과값을 ?ans=의 GET방식으로 보내는게 목표이다.


이건 brainfuck이라는 언어이다. 이 부분을 읽어와서 해석하면 된다.


근데 구글에 brainfuck interpreter라고 쳐봐도 자바스크립트만 나와서 파이썬용으로 찾았다.


https://github.com/DoctorLai/PyUtils/blob/master/bf.py 여기에 어떤분이 친절하게 올려주셔서


가져다가 조금 수정해서 썼다.


import urllib2

def bf(src, left, right, data, idx):
    """
        brainfuck interpreter
        src: source string
        left: start index
        right: ending index
        data: input data string
        idx: start-index of input data string
    """
    retstr = ''
    if len(src) == 0: return 
    if left < 0: left = 0
    if left >= len(src): left = len(src) - 1
    if right < 0: right = 0
    if right >= len(src): right = len(src) - 1
    # tuning machine has infinite array size
    # increase or decrease here accordingly
    arr = [0] * 30000
    ptr = 0
    i = left
    while i <= right:
        s = src[i]
        if s == '>':
            ptr += 1
            # wrap if out of range
            if ptr >= len(arr):
                ptr = 0
        elif s == '<':
            ptr -= 1
            # wrap if out of range
            if ptr < 0:
                ptr = len(arr) - 1
        elif s == '+':
            arr[ptr] += 1
        elif s == '-':
            arr[ptr] -= 1
        elif s == '.':
            retstr += chr(arr[ptr]) #원래 있던 출력 대신 retstr에 한글자 한글자 더해서
        elif s == ',':
            if idx >= 0 and idx < len(data):
                arr[ptr] = ord(data[idx])
                idx += 1
            else:
                arr[ptr] = 0 # out of input
        elif s =='[':
            if arr[ptr] == 0:
                loop = 1
                while loop > 0:
                    i += 1
                    c = src[i]
                    if c == '[':
                        loop += 1
                    elif c == ']':
                        loop -= 1
        elif s == ']':
            loop = 1
            while loop > 0:
                i -= 1
                c = src[i]
                if c == '[':
                    loop -= 1
                elif c == ']':
                    loop += 1
            i -= 1
        i += 1
    return retstr #맨마지막에 다 끝나면 리턴함.
if __name__ == "__main__":
    req = urllib2.Request('http://www.enigmagroup.org/missions/programming/5/') 
    req.add_header('cookie','enigmafiedV4=내 쿠키')
    page = urllib2.urlopen(req).read()
    src = page[page.find('++'):page.find('.


')+1] #brainfuck 코드 부분을 가져왔다. brainfuck = bf(src, 0, len(src) - 1, "sdfsdf", 0) req = urllib2.Request('http://www.enigmagroup.org/missions/programming/5/?ans='+brainfuck) req.add_header('cookie','enigmafiedV4=내 쿠키') print urllib2.urlopen(req).read()