Python/2.7 information

wargame.kr pyc_decompile

qkqhxla1 2015. 3. 29. 17:25

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()







추가.


pyc2py.py

이건 파이썬 디컴파일러이다. .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 요기를 보고 본인이 씹거나 뜯거나 해볼 것.