攻防世界-crypto-easychallenge(.pyc反編譯)
進入題目後下載附件,發現是一個.pyc檔案。
pyc是一種二進位制檔案,是由py檔案經過編譯後,生成的檔案,是一種byte code,py檔案變成pyc檔案後,執行載入的速度會有所提高;另一反面,把py檔案編譯為pyc檔案,從而可以實現部分的原始碼隱藏,保證了python做商業化軟體時的安全性
用uncompyle6這個第三方python反編譯器來進行反編譯。
uncompyle6是一個原生python的跨版本反編譯器和fragment反編譯器,是decompyle、uncompyle、uncompyle2等的接替者。
uncompyle6可將python位元組碼轉換回等效的python原始碼,它接受python 1.3版到3.8版的位元組碼,這其中跨越了24年的python版本,此外還包括Dropbox的Python 2.5位元組碼和一些PyPy位元組碼。
github專案:https://github.com/rocky/python-uncompyle6
pip install uncompyle6
uncompyle6 -o . test.pyc
得到py程式碼如下:
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): return base64.b32encode(ans) flag = ' ' print 'Please Input your flag:' flag = raw_input() final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' if encode3(encode2(encode1(flag))) == final: print 'correct' else: print 'wrong'
程式碼解析
encode1函式是把輸入的字串分割成單獨的字元,先轉換為ascii數值,再與36異或,然後+25,接著轉回字元,最後拼接為新的字串輸出。
因此對應的decode1函式應該是先-25,再與36異或(異或的逆操作還是異或)。
encode2函式是把輸入的字串分割成單獨的字元,先轉換為ascii數值,再+36,然後與36異或,接著轉回字元,最後拼接為新的字串輸出。
因此對應的decode2函式應該是先與36異或,再-36。
encode3函式是呼叫base64庫裡的b32encode()函式進行base32運算。
因此對應的decode3函式應該是base64.b32decode()。
下面是對應的解密程式碼
import base64 def decode1(ans): s = '' for i in ans: x = ord(i) - 25 x = x ^ 36 s += chr(x) return s def decode2(ans): s = '' for i in ans: x = i^ 36 x = x - 36 s += chr(x) return s def decode3(ans): return base64.b32decode(ans) final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' flag=decode1(decode2(decode3(final))) print(flag)
得到對應的flag為cyberpeace{interestinghhhhh}
參考:https://www.jianshu.com/p/aafdedcbab4f