攻防世界wp-misc base64stego


首先下載附件,得到一個壓縮包,發現有密碼。

這個時候先用winhex打開。

首先要了解偽加密。

0x00:ZIP偽加密

一個ZIP文件由三個部分組成:壓縮源文件數據區+壓縮源文件目錄區+壓縮源文件目錄結束標志。
偽加密原理:zip偽加密是在文件頭的加密標志位做修改,進而再打開文件時識被別為加密壓縮包。

 

 一般來說,文件各個區域開頭就是50 4B,然后后面兩個字節是版本,再后面兩個就是判斷是否有加密的關鍵了。

比如這題:

壓縮源文件數據區:


50 4B 03 04:這是頭文件標記(0x04034b50)
14 03:解壓文件所需 pkware 版本
00 00:全局方式位標記(判斷有無加密的重要標志)
08 00:壓縮方式
68 BF:最后修改文件時間
9B 48:最后修改文件日期
FE 32 7D 4B:CRC-32校驗
E9 0D 00 00:壓縮后尺寸
B5 1B 00 00:未壓縮尺寸
09 00:文件名長度
00 00:擴展記錄長度



壓縮源文件目錄區:

 

 

50 4B 01 02:目錄中文件文件頭標記(0x02014b50)
3F 03:壓縮使用的 pkware 版本
14 03:解壓文件所需 pkware 版本
00 00:全局方式位標記(有無加密的重要標志,這個更改這里進行偽加密,改為09 00打開就會提示有密碼了)
08 00:壓縮方式
68 BF:最后修改文件時間
9B 48:最后修改文件日期
FE 32 7D 4B:CRC-32校驗(1480B516)
E9 0D 00 00:壓縮后尺寸(25)
B5 1B 00 00:未壓縮尺寸(23)
09 00:文件名長度
24 00:擴展字段長度
00 00:文件注釋長度
00 00:磁盤開始號
00 00:內部文件屬性
20 80 ED 81:外部文件屬性
00 00 00 00:局部頭部偏移量

 

壓縮源文件目錄結束標志:

50 4B 05 06:目錄結束標記
00 00:當前磁盤編號
00 00:目錄區開始磁盤編號
01 00:本磁盤上紀錄總數
01 00:目錄區中紀錄總數
5B 00 00 00:目錄區尺寸大小
10 0E 00 00:目錄區對第一張磁盤的偏移量
00 00:ZIP 文件注釋長度

然后就是識別真假加密
1.無加密
壓縮源文件數據區的全局加密應當為00 00
且壓縮源文件目錄區的全局方式位標記應當為00 00
2.假加密
壓縮源文件數據區的全局加密應當為00 00
且壓縮源文件目錄區的全局方式位標記應當為09 00
3.真加密
壓縮源文件數據區的全局加密應當為09 00
且壓縮源文件目錄區的全局方式位標記應當為09 00

然后這題全局為00 00 但是在結尾發現是09 00,所以為假加密,把09 00 改成00 00就能解壓打開文件了。

得到如下文件:

 txt下面很多符號,結合題目是base64,但是這么長一串base64肯定有問題,然后看大佬們base64隱寫解密腳本,運行得到答案。

解密腳本:

 

import base64 b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('stego.txt', 'rb') as f: bin_str = ''
    for line in f.readlines(): stegb64 = str(line, "utf-8").strip("\n") rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n") offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1])) equalnum = stegb64.count('=')  # no equalnum no offset
        if equalnum: bin_str += bin(offset)[2:].zfill(equalnum * 2) print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)]))  # 8 位一組

 

還有個加密腳本:

# -*- coding: cp936 -*-
import base64 flag = 'Tr0y{Base64isF4n}'  # flag
bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag]) base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1:  # '0.txt'是明文, '1.txt'用於存放隱寫后的 base64
    for line in f0.readlines(): rowstr = base64.b64encode(line.replace('\n', '')) equalnum = rowstr.count('=') if equalnum and len(bin_str): offset = int('0b' + bin_str[:equalnum * 2], 2) char = rowstr[len(rowstr) - equalnum - 1] rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset]) bin_str = bin_str[equalnum * 2:] f1.write(rowstr + '\n')

 

 

總結:

參考博客:

偽加密:https://blog.csdn.net/weixin_41687289/article/details/82695801

base64隱寫:https://www.tr0y.wang/2017/06/14/Base64steg/

 


免責聲明!

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



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