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 |