攻防世界-misc-base64stego


得到一個加密的壓縮包

百度了一下,簡單了解zip文件的結構:
zip文件由三部分構成:壓縮源文件數據區+目錄區+目錄結束區
源文件數據區:文件頭+文件數據+數據描述符

通過百度我們知道這個zip文件是一個偽加密
需要使用winhex工具去修改文件頭的加密標志位,或者使用zipcenop.jar
下面說說兩種工具的簡單使用:

  • winhex
    可參考https://blog.csdn.net/pdsu161530247/article/details/73612910
    大致操作如下截圖:

    為什么要搜索50 4B呢,因為50 4B 01 02是目錄中文件文件頭標記,關於更多詳細信息參考上面給出的帖子

  • zipcenop.jar
    或者使用zipcenop.jar(需要java環境)進行破解:

java -jar ZipCenOp.jar r a2eb7ceaf5ab49f7acb33de2e7eed74a.zip

得到一個base64加密的文本:
行數有點多,此處就不放該文本了

解密后得到如下內容:
Steganography is the art and science of writing hidden messages in such a way that no one
沒有flag
這里涉及到一個base64的隱寫
我們可以利用base64的隱寫py腳本跑出結果:

Base_sixty_four_point_five

由於本人也沒有學過python,此處關於腳本的編寫我也是直接copy的別人的腳本:

import re
import base64

b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

# s.txt為待解密的base64隱寫字符串所在的文件
f = open('s.txt','r')
base64str = f.readline()

# pattern2用於匹配兩個等號情況時,等號前的一個字符
# pattern2用於匹配一個等號情況時,等號前的一個字符
pattern2 = r'(\S)==$'
pattern1 = r'(\S)=$'

# 提取后的隱寫二進制字符加入binstring中
binstring = ''

# 逐行讀取待解密的base64隱寫字符串,逐行處理
while(base64str):
    # 先匹配兩個等號的情況,如果匹配不上,再配置一個等號的情況
    # 如果無等號,則沒有隱藏,無需處理
    if re.compile(pattern2).findall(base64str):
        # mstr為等號前的一個字符,該字符為隱寫二進制信息所在的字符
        mstr = re.compile(pattern2).findall(base64str)[0]
        # 確認mstr字符對應的base64二進制數,賦值給mbin
        mbin = bin(b64chars.find(mstr))
        # mbin格式如0b100,mbin[0:2]為0b
        # mbin[2:].zfill(6)為將0b后面的二進制數前面補0,使0b后面的長度為6
        mbin2 = mbin[0:2] + mbin[2:].zfill(6)
        # 兩個等號情況隱寫了4位二進制數,所以提取mbin2的后4bit
        # 賦值給stegobin,這就是隱藏的二進制信息
        stegobin = mbin2[-4:]
        binstring += stegobin
    elif re.compile(pattern1).findall(base64str):
        mstr = re.compile(pattern1).findall(base64str)[0]
        mbin = bin(b64chars.find(mstr))
        mbin2 = mbin[0:2] + mbin[2:].zfill(6)
        # 一個等號情況隱寫了2位二進制數,所以提取mbin2的后2bit
        stegobin = mbin2[-2:]
        binstring += stegobin
    base64str = f.readline()

# stegobin將各行隱藏的二進制字符拼接在一起
# 從第0位開始,8bit、8bit處理,所以range的步進為8
for i in range(0,len(binstring),8):
    # int(xxx,2),將二進制字符串轉換為10進制的整數,再用chr()轉為字符
    print(chr(int(binstring[i:i+8],2)),end='')
print()

可參考:
https://www.jianshu.com/p/1e4308489865
https://www.tr0y.wang/2017/06/14/Base64steg/


免責聲明!

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



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