WarGame/wargame.kr

[WarGame] pyc decomplie

btr95 2018. 10. 30. 21:28



python에서 .pyc는 컴파일된 파일입니다.

문제 자체가 decomplie하라는 문제이기 때문에 해당 파일을 디컴파일 먼저 수행해야 합니다.



"Easy Python Decompiler" 프로그램을 통해 간단하게 수행할 수 있습니다.

해당 프로그램을 사용하면 .pyc_dis 파일이 생성되고 확장자를 py로 바꾸고 열어보면 코드를 확인 할 수 있습니다.



아래 코드의 flag가 답을 얻기 위해 찾아야 되는 값입니다.

그리고 현재 시간을 통해서 ok변수 값의 flag값이 만들어지고 입력한 flag값과 비교를 합니다.


그렇다면 모르는 flag값을 제외한 코드를 사용해서 flag값을 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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()
cs



최종적으로 아래 코드를 이용해서 flag값을 획득 할 수 있습니다.

하지만 서버 시간과 사용자pc의 시간이 달라 flag값이 제대로 되지 않을 수 있습니다.


서버 시간에 맞춰 pc시간을 조정해서 python코드를 실행하면 올바른 값을 얻을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Embedded file name: bughela.py
import time
from sys import exit
from hashlib import sha512
 
def main():
    print 'import me :D'
    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]
    print(ok)
 
if __name__ == '__main__':
    main()
cs