http://wargame.kr:8080/pyc_decompile/
bughela.pyc를 준다. 이걸 해석해서 원하는 flag를 입력하면 된다. 이걸 우리가 보기 좋게 변환하는 모듈이 있다. uncompyle2모듈이다.
다운로드 : https://pypi.python.org/pypi/uncompyle2/1.1
다운받아서 설치 후
import uncompyle2 with open("bughela.py", "wb") as fileobj: uncompyle2.uncompyle_file("bughela.pyc", fileobj)
이렇게 실행한다. 이 코드를 실행하면 bughela.py로 좋게 변환되어있다.
이게 아니라도
Easy Python Decompiler v1.3.1a.7z
를 이용하면 된다. (Hide님의 글에서 가져왔음. http://hides.tistory.com/279)
#Embedded file name: bughela.py import time from sys import exit from hashlib import sha512 def main(): print 'import me :D' def GIVE_ME_FLAG(flag): if flag[:43] != 'http://wargame.kr:8080/pyc_decompile/?flag=': die() flag = flag[43:] now = time.localtime(time.time()) seed = time.strftime('%m/%d/HJEJSH', time.localtime()) hs = sha512(seed).hexdigest() start = now.tm_hour % 3 + 1 end = start * (now.tm_min % 30 + 10) ok = hs[start:end] if ok != flag: die() print 'GOOD!!!' def die(): print 'NOPE...' exit() if __name__ == '__main__': main()
이제 이걸 해석해서 문제를 풀면 된다. 서버의 시간값과 분값이 중요하므로 새로고침하면서 서버 시간을 알아내서 시간과 분을 가져와서 보내면 된다.
# -*- encoding: cp949 -*- #import uncompyle2 #with open("bughela.py", "wb") as fileobj: # print uncompyle2.uncompyle_file("bughela.pyc", fileobj) #Embedded file name: bughela.py import time from sys import exit from hashlib import sha512 import urllib2, re session = 본인 로그인 유지용 세션 req = urllib2.Request('http://wargame.kr:8080/pyc_decompile/') req.add_header('cookie','ci_session='+session) time_now = urllib2.urlopen(req).read() hour = re.findall('<h1>\d+/\d+/\d+\s+(.*):\d+:\d+</h1>',time_now)[0] min = re.findall('<h1>\d+/\d+/\d+\s+\d+:(.*):\d+</h1>',time_now)[0] now = time.localtime(time.time()) seed = time.strftime('%m/%d/HJEJSH', time.localtime()) hs = sha512(seed).hexdigest() start = int(hour) % 3 + 1 end = start * (int(min) % 30 + 10) ok = hs[start:end] req = urllib2.Request('http://wargame.kr:8080/pyc_decompile/?flag='+ok) req.add_header('cookie','ci_session='+session) print urllib2.urlopen(req).read()
추가.
이건 파이썬 디컴파일러이다. .pyc파일을 .py파일로 변경해준다. 근데 위처럼 다 변환해주는게 아니다. cmd에서 python pyc2py.py bughela.pyc 처럼 입력하면 해당 위치에 bughela.py파일이 생성된다. 하지만 이건 중간 과정(?)으로 변환시켜준다. 생성된 bughela.py는 아래와 같다.
#!/usr/bin/env python # # Filename: bughela.py # # Note: This file will only import in Python ! # Timestamp: Mon Feb 09 16:13:20 2015 # import marshal, imp if imp.get_magic() != '\x03\xf3\r\n': raise ImportError('wrong Python version; need Python ') __code = marshal.loads('c\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00@\x00\x00\x00sa\x00\x00\x00d\x00\x00d\x01\x00l\x00\x00Z\x00\x00d\x00\x00d\x02\x00l\x01\x00m\x02\x00Z\x02\x00\x01d\x00\x00d\x03\x00l\x03\x00m\x04\x00Z\x04\x00\x01d\x04\x00\x84\x00\x00Z\x05\x00d\x05\x00\x84\x00\x00Z\x06\x00d\x06\x00\x84\x00\x00Z\x07\x00e\x08\x00d\x07\x00k\x02\x00r]\x00e\x05\x00\x83\x00\x00\x01n\x00\x00d\x01\x00S(\x08\x00\x00\x00i\xff\xff\xff\xffN(\x01\x00\x00\x00t\x04\x00\x00\x00exit(\x01\x00\x00\x00t\x06\x00\x00\x00sha512c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\t\x00\x00\x00d\x01\x00GHd\x00\x00S(\x02\x00\x00\x00Ns\x0c\x00\x00\x00import me :D(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x04\x00\x00\x00main\x05\x00\x00\x00s\x02\x00\x00\x00\x00\x01c\x01\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\xb5\x00\x00\x00|\x00\x00d\x01\x00 d\x02\x00k\x03\x00r\x1a\x00t\x00\x00\x83\x00\x00\x01n\x00\x00|\x00\x00d\x01\x00\x1f}\x00\x00t\x01\x00j\x02\x00t\x01\x00j\x01\x00\x83\x00\x00\x83\x01\x00}\x01\x00t\x01\x00j\x03\x00d\x03\x00t\x01\x00j\x02\x00\x83\x00\x00\x83\x02\x00}\x02\x00t\x04\x00|\x02\x00\x83\x01\x00j\x05\x00\x83\x00\x00}\x03\x00|\x01\x00j\x06\x00d\x04\x00\x16d\x05\x00\x17}\x04\x00|\x04\x00|\x01\x00j\x07\x00d\x06\x00\x16d\x07\x00\x17\x14}\x05\x00|\x03\x00|\x04\x00|\x05\x00!}\x06\x00|\x06\x00|\x00\x00k\x03\x00r\xac\x00t\x00\x00\x83\x00\x00\x01n\x00\x00d\x08\x00GHd\x00\x00S(\t\x00\x00\x00Ni+\x00\x00\x00s+\x00\x00\x00http://wargame.kr:8080/pyc_decompile/?flag=s\x0c\x00\x00\x00%m/%d/HJEJSHi\x03\x00\x00\x00i\x01\x00\x00\x00i\x1e\x00\x00\x00i\n\x00\x00\x00s\x07\x00\x00\x00GOOD!!!(\x08\x00\x00\x00t\x03\x00\x00\x00diet\x04\x00\x00\x00timet\t\x00\x00\x00localtimet\x08\x00\x00\x00strftimeR\x01\x00\x00\x00t\t\x00\x00\x00hexdigestt\x07\x00\x00\x00tm_hourt\x06\x00\x00\x00tm_min(\x07\x00\x00\x00t\x04\x00\x00\x00flagt\x03\x00\x00\x00nowt\x04\x00\x00\x00seedt\x02\x00\x00\x00hst\x05\x00\x00\x00startt\x03\x00\x00\x00endt\x02\x00\x00\x00ok(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x0c\x00\x00\x00GIVE_ME_FLAG\x08\x00\x00\x00s\x18\x00\x00\x00\x00\x01\x10\x00\n\x01\n\x01\x15\x01\x18\x01\x12\x01\x11\x01\x15\x01\r\x01\x0c\x00\n\x01c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x10\x00\x00\x00d\x01\x00GHt\x00\x00\x83\x00\x00\x01d\x00\x00S(\x02\x00\x00\x00Ns\x07\x00\x00\x00NOPE...(\x01\x00\x00\x00R\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyR\x03\x00\x00\x00\x14\x00\x00\x00s\x04\x00\x00\x00\x00\x01\x05\x01t\x08\x00\x00\x00__main__(\t\x00\x00\x00R\x04\x00\x00\x00t\x03\x00\x00\x00sysR\x00\x00\x00\x00t\x07\x00\x00\x00hashlibR\x01\x00\x00\x00R\x02\x00\x00\x00R\x11\x00\x00\x00R\x03\x00\x00\x00t\x08\x00\x00\x00__name__(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x08\x00\x00\x00<module>\x01\x00\x00\x00s\x0e\x00\x00\x00\x0c\x01\x10\x01\x10\x02\t\x03\t\x0c\t\x04\x0c\x01') del marshal, imp exec __code del __code
이건 바이트코드로 볼 수 있다. import dis로 dis모듈을 임포트 후, del marshal, imp 윗줄에
print dis.dis(__code)로 출력해보자. 바이트코드는 https://docs.python.org/2/library/dis.html 요기를 보고 본인이 씹거나 뜯거나 해볼 것.
'Python > 2.7 information' 카테고리의 다른 글
파이썬다운(?) 코드. (0) | 2015.04.22 |
---|---|
파이썬 출력 format관련. (0) | 2015.04.16 |
분수 관련 fraction과 struct모듈 (0) | 2015.03.28 |
파이썬을 더 멋있게 쓰기위한 함수, itertools 모듈 (0) | 2015.03.05 |
*args, **kwargs (0) | 2015.03.01 |