題目來源:
NJUPT_CTF
題目描述:
你們走到了一個冷冷清清的謎題前面,小魚看著題目給的資訊束手無策,丈二和尚摸不著頭腦 ,你嘿嘿一笑,拿出來了你隨身帶著的筆記本電腦,噼里啪啦的敲起來了鍵盤,清晰的函式邏輯和流程出現在 了電腦螢屏上,你敲敲鍵盤,更改了幾處地方,運行以后答案變出現在了電腦螢屏上,
題目附件:
42aa1a89e3ae48c38e8b713051557020.pyc
題目思路:
反編譯可以使用uncompyle6或者在線反編譯pyc
安裝uncompyle6,反編譯pyc,將最后的值通過逆運算得出flag
解題程序:
附件下載下來發現是一個.pyc檔案,pyc是一種二進制檔案,是由py檔案經過編譯后,生成的檔案,是一種byte code,py檔案變成pyc檔案后,運行加載的速度會有所提高;另一方面,把py檔案編譯為pyc檔案,從而可以實作部分的原始碼隱藏,保證了python做商業化軟體時的安全性
uncompyle6是一個原生python的跨版本反編譯器和fragment反編譯器,是decompyle、uncompyle、uncompyle2等的接替者,uncompyle6可將python位元組碼轉換回等效的python源代碼,它接受python 1.3版到3.8版的位元組碼,這其中跨越了24年的python版本,此外還包括Dropbox的Python 2.5位元組碼和一些PyPy位元組碼,
pip3 install uncompyle6
#在.pyc所在檔案夾位置打開cmd,輸入命令
uncompyle6 -o . XXX.pyc
成功反編譯為出.py檔案,將print 'correct’改為print(‘correct’),將flag=raw_input()改為flag = eval(input())就可以運行了
# uncompyle6 version 3.6.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: ans.py
# Compiled at: 2018-08-09 11:29:44
import base64
def encode1(ans):#異或和加和運算
s = ''
for i in ans:
x = ord(i) ^ 36
x = x + 25
s += chr(x)
return s
def encode2(ans):#異或和加和運算
s = ''
for i in ans:
x = ord(i) + 36
x = x ^ 36
s += chr(x)
return s
def encode3(ans):#呼叫base64庫里的b32encode()函式進行base32運算,
return base64.b32encode(ans)
flag = ' '
print('Please Input your flag:')
flag = eval(input())
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
print('correct')
else:
print('wrong')
首先是進入函式的順序改成先進函式3再進2最后進1,然后就是每個函式內部運算,+變-,-變+,異或運算的逆程序就是再做一次異或
import base64
s="UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==="
s=base64.b32decode(s).decode('ISO-8859-1')
m = ''
for i in s:
x =ord(i)^36
x = x - 36
m+= chr(x)
h = ''
for i in m:
x = ord(i) - 25
x = x ^ 36
h+= chr(x)
print(h)
cyberpeace{interestinghhhhh}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295338.html
標籤:其他
