Base64stego


攻防世界_Misc_新手區_base64stego

題目描述:菜狗經過幾天的學習,終於發現了如來十三掌最后一步的精髓

知識點

BASE64 是一種編碼方式, 是一種可逆的編碼方式.
編碼后的數據是一個字符串, 包含的字符為: A-Za-z0-9+/
共 64 個字符:26 + 26 + 10 + 1 + 1 = 64
其實是 65 個字符, “=”是填充字符.

64 個字符需要 6 位二進制來表示, 表示成數值為 0~63.
Base64
長度為 3 個字節的數據經過 Base64 編碼后會變為 4 個字節

例如:

示例

三個字符的數據位數是38=24 正好24=64所以能剛好分為4組,如果數據位數不是6的倍數就會有空位,此時需要往后補0湊夠6的倍數,如果8個數據位全為0則對應“=”

示例

注意到119的ASCLL碼對應的二進制是0 1 1 1 0 1 1 1,而加密出的字符c只有其后四位有關,所以0 1 1 1 0 0中后面兩個0可以任意修改而不會影響解密后的結果,所以就可以在這兩位中隱藏數據,(至於為什么不能再最后面的0 0 0 0 0 0中隱藏數據 :000000對應的是 ' = ' 如果改動后解密出來的結果就變了,容易被人發現。)

tips:有一個 ‘ = ’ 可以隱藏兩位數據 兩個 ‘ = ’可以隱藏四位,‘ = ’最多只能有兩位。

至此給出這道題的python腳本。
其實對應的這種題python有專門的base64庫來寫腳本,這里給出的是最基本的語法編寫了。

base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
path = input("path")   #讀取文件的位置
def change(string_test) :
    strings_ans = ""
    for every in string_test :
        bin_num = ""
        if every == "=" :
            return strings_ans
        else :
            num = base64.find(every)
            while num != 0 :
                bin_num += str(num%2)
                num = int(num/2)
            while len(bin_num) <6 :
                bin_num += "0"
            bin_num = bin_num[::-1]
        strings_ans += bin_num
    return strings_ans
def answer(strings_last) :
    ans = ""
    strings_temp = change(strings_last)
    if strings_last.count('=') == 1 :
        ans += strings_temp[-2:]
    else :
        ans += strings_temp[-4:]
    return ans
with open(path + "\\" + "stego.txt","r") as in_file :   #輸入文件的名稱
    strings_first = in_file.readlines()
    strings = []
    for every_strings in strings_first :
        if every_strings[-2] =="=" :
            strings.append(every_strings)
with open(path + "\\" + "out.txt","w") as out_file :    #輸出文件的名稱
    ans = ""
    for line in strings :
        ans += answer(line)
    num = 0
    list_num = []
    for i in range(0,len(ans)) :
        num = num*2+int(ans[i])
        if (i+1)%8 == 0 :
            list_num.append(num)
            num = 0
    ans = ""
    for i in list_num :
        ans += chr(i)
    out_file.write(ans)

flag{Base_sixty_four_point_five}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM