首先下載附件,得到一個壓縮包,發現有密碼。
這個時候先用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/