1. 程式人生 > 實用技巧 >攻防世界-crypto-easychallenge(.pyc反編譯)

攻防世界-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