Misc All In One(施工中)
C3ngH Lv4

image

编码/加密

Base家族

在线网站:https://cyberchef.org/

1
2
3
4
5
6
7
8
9
10
#flag

666C6167 #base16
MZWGCZY= #base32[A-Z2-7]
727432 #base36
3cr9Ae #base58
Zmxh #base64
Ao(mg #base85
@iH<Z #base91
F#S<I #base92

base64可以换表编码

1
2
表:sQ+3ja02RchXLUFmNSZoYPlr8e/HVqxwfWtd7pnTADK15Evi9kGOMgbuIzyB64CJ
密文:SjaoNgS0xgagUTpwe3QwHn4MrbkD/OUwqOQG/bpveg6Mqa4WH0k46

MD5

在线网站:https://www.cmd5.com/

1
2
3
4
5
6
#flag{md5}

121b1afe793917a2cc0fc60a4eb2d3c6 #32位
121b1afe793917a2cc0fc60a4eb2d3c6 #16位

#16位是取32位的8-24位

Byte类型

image

emoji-AES

在线网站:https://aghorler.github.io/emoji-aes/

1
2
3
密文:🙃💵🌿🎤🚪🌏🐎🥋🚫😆✅🌊🚰✖😇😊🐍😀🔪😇🚰🎈🏎😂❓😁🍎👑⏩🚫❓🎅🎃😡⌨☀🍌😁✖😂🏎🍌🎃🗒
明文:flag
密钥:key

emoji解码

在线网站:http://www.atoolbox.net/Tool.php?Id=937

1
🐯👏👋🐾👚👪👇👱👞👚🐦👡👙👚👏👍🐯👏🐽👐👜🐦👇👱👜👙👤👡👙🐬👥🐻🐯👏👋👈👚👪👇👘👰👛👮👡👙👎🐭🐯

二维码

解码在线网站:https://cli.im/deqr/other

分析修复在线网站:https://merri.cx/qrazybox/

频次分析

字频分析:https://lzltool.cn/Tools/LetterFrequency

词频分析:https://quipqiup.com/

摩斯电码

可能只有.-0 1组成,也可能是其他只有两种字符的情况,通常会使用空格、换行或/进行分割

维吉尼亚密码

  • 给出密钥 -> CyberChef
  • 没有密钥 -> 根据对照表手搓密钥

在线网站:https://ctf.bugku.com/tool/vigenere

维吉尼亚flag爆破脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#By C3ngH
def vigenere_decrypt(ciphertext, key):
plaintext = []
key_length = len(key)
key_index = 0

for char in ciphertext:
if char.isalpha():
key_char = key[key_index % key_length]
shift = ord(key_char.upper()) - ord('A')
if char.isupper():
decrypted_char = chr((ord(char) - ord('A') - shift) % 26 + ord('A'))
else:
decrypted_char = chr((ord(char) - ord('a') - shift) % 26 + ord('a'))
plaintext.append(decrypted_char)
key_index += 1
else:
plaintext.append(char)

return ''.join(plaintext)

def vigenere_bruteforce(ciphertext, known_plaintext, max_key_length):
from itertools import product
import string

keyspace = string.ascii_uppercase
ciphertext = ciphertext
known_plaintext = known_plaintext

for key_length in range(1, max_key_length + 1):
for key_tuple in product(keyspace, repeat=key_length):
key = ''.join(key_tuple)
decrypted_text = vigenere_decrypt(ciphertext[:len(known_plaintext)], key)
# 只比较字母字符
if ''.join(filter(str.isalpha, decrypted_text)) == ''.join(filter(str.isalpha, known_plaintext)):
return key, vigenere_decrypt(ciphertext, key)

return None, None

# 示例输入
ciphertext = input("输入待解密的密文: ")
known_plaintext = input("输入flag的开头部分: ")
max_key_length = len(known_plaintext)

# 爆破密钥
key, decrypted_message = vigenere_bruteforce(ciphertext, known_plaintext, max_key_length)

print(f"密钥: {key}")
print(f"成功解密flag: {decrypted_message}")

希尔密码

已知密文和密钥,并且密钥(key)是一个网址,如http://www.verymuch.net

已知密文和密钥,并且密钥是四个数字

1
2
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
密钥:3 4 19 11

在线网站:https://www.metools.info/code/hillcipher243.html

Rabbit加密

密文形式类似base64,但可能有+

在线网站:https://www.sojson.com/encrypt_rabbit.html

幂数加密/云影密码

密文只由0 1 2 4 8组成

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
with open(r'C:/Users/67300/Download/1.txt','r') as f:	#修改路径
data = f.read()
print(data)

list = data.split('0')
print(list)

datalist=[]
def dlist(list):
d = 0
for i in list:
for j in i:
d += int(j)
datalist.append(d)
d=0
return datalist
datalist = dlist(list)

def str(datalist):
s=''
for i in datalist:
s += chr(i+64)
return s
print(str(datalist))

曼彻斯特编码 & 差分曼彻斯特编码

image

详见:数据通信基础 4.1| C3ngH’s B10g

使用曼彻斯特编码转换工具进行转换

image

社会主义核心价值观编码

在线网站:http://www.hiencode.com/cvencode.html

音符解密

1
♭♯♪‖¶♬♭♭♪♭‖‖♭♭♬‖♫♪‖♩♬‖♬♬♭♭♫‖♩♫‖♬♪♭♭♭‖¶∮‖‖‖‖♩♬‖♬♪‖♩♫♭♭♭♭♭§‖♩♩♭♭♫♭♭♭‖♬♭‖¶§♭♭♯‖♫∮‖♬¶‖¶∮‖♬♫‖♫♬‖♫♫§=

注意:加密的密文一定是以=结尾的,如果没有需要自己加

在线网站:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue

敲击码

基于5×5方格波利比奥斯方阵实现,不同点是是用K字母被整合到C中,因此密文的特征为1-5的两位一组的数字,编码的范围是A-Z字母字符集,字母不区分大小写。

image

在线网站:http://www.hiencode.com/tapcode.html

盲文

在线网站:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen

Polybius密码

image

在线网站:http://www.atoolbox.net/Tool.php?Id=913

AES加密

埃特巴什码(Atbash)

1
密文:(+w)v&LdG_FhgKhdFfhgahJfKcgcKdc_eeIJ_gFN

在线网站:https://www.metools.info/code/atbash209.html

DNA编码

1
密文:AATTCAACAACATGCTGC

脚本:https://github.com/omemishra/DNA-Genetic-Python-Scripts-CTF

仿射密码

有两个key,key-a为必须是(1,3,5,7,9,11,15,17,19,21,23,25)中的一个,key-b是0~25的数字

在线网站:http://www.hiencode.com/affine.html

Brainfuck

1
密文:+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< 

在线网站:https://tool.bugku.com/brainfuck/

Ook!

image

在线网站:https://tool.bugku.com/brainfuck/

与佛论禅 / 与熊论道 / 兽语加密

通常以佛曰熊曰开头,中文乱码

在线网站:http://hi.pcmoe.net/

在线网站:https://ctf.bugku.com/tool/todousharp

空白格 / 无字天书:

image

在线网站:https://www.w3cschool.cn/tryrun/runcode?lang=whitespace

在线网站:https://vii5ard.github.io/whitespace/

Serpent解密

在线网站:https://www.ssleye.com/ssltool/ser_cipher.html

零宽隐写

在线网站:http://330k.github.io/misc_tools/unicode_steganography.html

Gronsfeld密码

1
2
3
4
5
6
7
8
# 解密脚本
from pycipher import Gronsfeld

cipher = 'TGLBOMSJNSRAJAZDEZXGHSJNZWHG'
key = [1,50,61,8,9,20,63,41]
secret = Gronsfeld(key).decipher(cipher)

print(secret)

UUencode编码

有点像base85

1
2
=8S4U,3DR8SDY,C`S-F5F-C(S,S<R-C`Q9F8S87T`
# c55192c992036ef623372601ff3a}

在线网站:https://www.qqxiuzi.cn/bianma/uuencode.php

AAencode编码

1
2
密文:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

在线网站:http://www.hiencode.com/aaencode.html

XXencode编码

和UUencode有点像

在线网站:https://try8.cn/tool/code/xxencode

snow隐写

在行尾附加空格和制表符来隐藏 ASCII 文本中的消息

官网:https://www.darkside.com.au/snow/

参数 作用
-C 如果隐藏,则压缩数据,或者如果提取,则会解压缩。
-Q 静音模式。如果未设置,则程序报告统计信息,例如压缩百分比和可用存储空间的数量。
-S 报告文本文件中隐藏消息的近似空间量。考虑线长度,但忽略其他选项。
-p password 如果设置为此,则在隐藏期间将使用此密码加密数据,或在提取期间解密。
-l line-length 在附加空格时,Snow将始终产生比此值短的线条。默认情况下,它设置为80。
-f message-file 此文件的内容将隐藏在输入文本文件中。
-m message-string 此字符串的内容将被隐藏在输入文本文件中。请注意,除非在字符串中包含一个换行符,否则在提取邮件时,否则不会打印换行符。
  • 加密消息

    1
    SNOW.EXE -C -m "qsdz yyds" -p "duzou" infile outfile
  • 提取消息

    1
    SNOW.EXE -C -p "duzou" infile outfile

需要注意的是,infile 必须在 outfile 前,如果不填 infile 选项,则默认从标准输入中获得;如果不填 outfile 选项,则默认输出到标准输出中。

中文电报

类似于四位数一组的编码

1
5337 5337 2448 2448 0001 2448 0001 2161 1721 1869 6671 0008 3296 4430 0001 3945 0260 3945 1869 4574 5337 0344 2448 0037 5337 5337 0260 0668 5337 6671 0008 3296 1869 6671 0008 3296 1869 2161 1721 

在线网站:https://www.qqxiuzi.cn/bianma/dianbao.php

Quote-Printable编码

1
密文:=E6=8A=80=E6=9C=AF=E6=9C=89=E6=B8=A9=E5=BA=A6

在线网站:https://try8.cn/tool/code/qp

中文ASCII码

1
27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 21462 21518 27573 102 108 97 103

加上 & # ;

1
&#27880;&#30693;&#25915;&#21892;&#38450;&#23454;&#39564;&#23460;&#21457;&#36865;&#112;&#108;&#98;&#99;&#116;&#102;&#33719;&#21462;&#21069;&#27573;&#102;&#108;&#97;&#103;&#20851;&#27880;&#79;&#110;&#101;&#45;&#70;&#111;&#120;&#23433;&#20840;&#22242;&#38431;&#22238;&#22797;&#112;&#108;&#98;&#99;&#116;&#102;&#33719;&#21462;&#21518;&#27573;&#102;&#108;&#97;&#103;

在线网站:https://www.xuhuhu.com/beautify/ascii/

培根密码

由 a、b 或者 A、B 或者 0、1 组成的密文,密文中只有两种字符,可以直接使用 随波逐流 解密

CyberChef 的培根密码解密可能会有点问题,这里建议用随波逐流解密

锟斤拷

成因是 Unicode 的替换字符(Replacement Character,�)于 UTF-8 编码下的结果 EF BF BD 重复,在 GBK 编码中被解释为汉字 “锟斤拷”(EF BF BD EF BF BD)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os

a = input('请选择你的功能(1、加密 2、解密):')
if a == "1":
s = input('请输入你要加密的话:')
utf = s.encode('utf')
gbk = s.encode('utf').decode('gbk', errors='ignore')
if len(s)%2 == 1:
gbk = gbk + "�"
print(gbk)
os.system("pause")
if a == "2":
s = input('请输入你要解密的话:')
gbk = s.encode('gbk')
utf = s.encode('gbk').decode('utf-8', errors='ignore')
print(utf)
os.system("pause")

键盘坐标密码

1
2
3
4
  1 2 3 4 5 6 7 8 9 0
1 Q W E R T Y U I O P
2 A S D F G H J K L
3 Z X C V B N M

11 21 31 18 27 33 34 -> QAZIJCV

福尔摩斯 跳舞的小人

image

手机九宫格键盘密码

82  73  42  31  22  31  33  41  32
U   R   H   D  B   D   F   G   E

利用编程代码画图

  1. LOGO编程语言【例题-[RCTF2019]draw 】
    在线编译器:https://www.calormen.com/jslogo/
  2. CFRS编程语言【例题-2024宁波市赛初赛 Misc2】
    在线画图网站:https://susam.net/cfrs.html

spammimic编码

spammimic - decoded

HGAME 2024有一题,可识读英文可以转成中文乱码,ROT8000编码

强网拟态2024 OSINT也是

malbolge

类似这样的

1
2
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>

类似题:2024 强网拟态 PvZ

在线网站:Malbolge - interpreter online (doleczek.pl)

解码工具

Ciphey

1
ciphey -t "aGVsbG8gbXkgbmFtZSBpcyBiZWU="	#WSL

CyberChef

Github源代码

CyberChef在线网站

Basecrack

1
python3 basecrack.py -m

image

随波逐流

随波逐流工作室

文件头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.zip的文件头:50 4B 03 04 14 00 08 00
.rar的文件头:52 61 72 21
.rar的文件尾:C4 3D 7B 00 40 07 00
.pyc的文件头:03 F3 0D 0A
.jpg的文件头:FF D8 FF
.png的文件头:89 50 4e 47 0d 0a 1a 0a 文件尾:49 45 4E 44 AE 42 60 82
#Tips:PNG文件的前16字节是已知的:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
.gif的文件头:47 49 46 38 39 61(GIF89A)或 47 49 46 38 37 61(GIF87A)
.gif的文件尾:00 3B
.gz的文件头:1F 8B 08 00
.pyc的文件头:03 F3 0D 0A
.psd的文件头:38 42 50 53
TIFF (tif),文件头:49492A00
Windows [Bitmap](https://so.csdn.net/so/search?q=Bitmap&spm=1001.2101.3001.7020) (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
M4a,文件头:00000018667479704D3441

图片通用隐写

属性-详细信息

Hint或Key可能藏在属性里

010Editor检查文件末尾

flag可能藏在文件末尾

010Editor检查文件头

可能存在文件头和文件后缀名不一致导致打不开的情况

binwalk & foremost

binwalk查看,foremost提取

盲水印隐写

项目地址:https://github.com/chishaxie/BlindWaterMark

1
2
3
4
5
6
bwm.py 程序文件python2版本
bwmforpy3.py 程序文件python***3.6***版本
hui.png 无水印的原图
wm.png 水印图
hui_with_wm.png 有盲水印的图
wm_from_hui.png 反解出来的水印图
1
python bwm.py encode hui.png wm.png hui_with_wm.png			#加密
1
python bwm.py decode hui.png hui_with_wm.png wm_from_hui.png		#解密

频域盲水印

Puzzle Solver一把梭

图片分离 / 拼接

1
2
3
4
5
6
7
#WSL
分解GIF的命令:convert glance.gif flag.png
水平镜像翻转图片:convert -flop reverse.jpg reversed.jpg
垂直镜像翻转图片:convert -flip reverse.jpg reversed.jpg
合成图片的命令:montage flag*.png -tile x1 -geometry +0+0 flag.png
-tile是拼接时每行和每列的图片数,这里用x1,就是只一行
-geometry是首选每个图和边框尺寸,我们边框为0,图照原始尺寸即可

OurSecret隐写

拖进OurSecret输入密钥进行解密

拼图

碎图片合成一张图片

1
2
3
#在Windows中使用imagemagick处理
magick.exe montage *.png -tile 18x10 -geometry 125x125+0+0 flag.jpg
magick montage *.png -tile 40x22 -geometry +0+0 flag-0.png
1
2
3
4
5
6
7
#在kali中处理
拉入kali里处理,如果是碎的图片,
先使用 montage *.PNG -tile 12x12 -geometry +0+0 out.png合成一张图片
*.png表示匹配所有图片
-tile表示图片的张数
-geometry +0+0表示每张图片的间距为0
合成后要先查看图片的宽高(宽高要相等,不相等要用PS调整)

然后把上面合成好的图片使用 Puzzle-Merak 工具进行智能拼图

image

image

输入 generation、population、size 并用分号分开即可开始自动拼图

也可以使用gaps智能拼图(在kali和wsl里使用都可以)

1
2
3
4
5
6
7
8
gaps --image=out.png --generation=30 --population=144 --size=30 --save 

--image 指向拼图的路径
--size 拼图块的像素尺寸
--generations 遗传算法的代的数量
--population 个体数量
--verbose 每一代训练结束后展示最佳结果
--save 将拼图还原为图像
1
2
3
4
5
6
gaps --image=flag.jpg --generations=50 --population=180 --size=125 --verbose

-generations 要迭代多少次
-population 有多少个小拼图
--size 每张小图,也就是拼图小块的大小
--verbose 实时显示

近邻法缩放图片

在PS中打开图片,然后在更改图像大小中,将宽高调成指定像素并将重新采样选项选为邻近(硬边缘)

pixeljihad

pixeljihad隐写 有密码

在线网站:https://sekao.net/pixeljihad/

隐写文本藏在原图片和隐写文件中间

在010 Editor中搜索IEND,查看后面有没有额外内容

提取图片中等距的像素点得到隐写的图片

在PowerShell中运行Get_Pixels.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#Get_Pixels.py
import os
import re
import cv2
import argparse
import itertools
import numpy as np


parser = argparse.ArgumentParser()
parser.add_argument('-f', type=str, default=None, required=True,
help='输入文件名称')
parser.add_argument('-p', type=str, default=None, required=True,
help='输入左上顶点和右下顶点坐标 (如:-p 220x344+3520x2150)')
parser.add_argument('-n', type=str, default=None, required=True,
help='输入宽度间隔和高度间隔 (如:-n 44x86)')
parser.add_argument('-size', type=str, default='1x1', required=False,
help='输入截取图像的大小 (如:-size 7x7)')
parser.add_argument('-resize', type=int, default=1, required=False,
help='输入截取图像放大倍数 (如:-resize 1)')
args = parser.parse_args()

if __name__ == '__main__':
if re.search(r"^\d{1,}x\d{1,}\+\d{1,}x\d{1,}$", args.p) and re.search(r"^\d{1,}x\d{1,}$", args.n) and re.search(r"^\d{1,}x\d{1,}$", args.size):
x1, y1 = map(lambda x: int(x), args.p.split("+")[0].split("x"))
x2, y2 = map(lambda x: int(x), args.p.split("+")[1].split("x"))
width, height = map(lambda x: int(x), args.n.split("x"))
width_size, height_size = map(lambda x: int(x), args.size.split("x"))

img_path = os.path.abspath(args.f)
file_name = img_path.split("\\")[-1]

img = cv2.imread(img_path, cv2.IMREAD_COLOR)
row, col = img.shape[:2]

r, c = len(range(y1, y2 + 1, height)), len(range(x1, x2 + 1, width))
new_img = np.zeros(shape=(r * height_size * args.resize, c * width_size * args.resize, 3))
for y, x in itertools.product(range(r), range(c)):
for y_size in range(height_size):
for x_size in range(width_size):
# new_img[y * height_size + y_size, x * width_size + x_size] = img[y1 + y * height + y_size, x1 + x * width + x_size]
pt1 = ((x * width_size + x_size) * args.resize, (y * height_size + y_size) * args.resize)
pt2 = ((x * width_size + x_size) * args.resize + args.resize, (y * height_size + y_size) * args.resize + args.resize)
color = img[y1 + y * height + y_size, x1 + x * width + x_size].tolist()
cv2.rectangle(new_img, pt1=pt1, pt2=pt2, color=color, thickness=-1)


cv2.imwrite(f"_{file_name}", new_img)
print("已保存到运行目录中...")
else:
print("参数-p或参数-n或参数-size, 输入错误!")
1
2
3
4
py main.py -f arcaea.png -p 0x0+3828x2148 -n 12x12
py main.py -f 要解密的图片 -p 第一个像素点的XY坐标+最后一个像素点的XY坐标 -n 两个等距像素点的XY距离的差值
如果是等距离提取整张图片中所有像素点,要注意右下角那个点的位置XY都要减去一倍的距离
Tips:在PS中按F8就可以看到每个像素点的具体坐标了

silenteye隐写

特征:放大图像后会有行列不对齐的小灰块

直接用 silenteye 打开输入密钥decode即可,默认密钥是 silenteye

图片报错改宽高后图片无变化

再 foremost 一下

DeEgger Embedder隐写

使用 DeEgger Embedder 工具 extract files

EXIF隐写

直接在 WSL 中输入以下命令查看即可,也可以直接使用 破空 flag 查找工具 进行查找

1
exiftool 1.jpg

PNG图片隐写

CRC错误

修改宽高,17~20是宽,21~24是高

可用Puzzle Solver一把梭修改

LSB隐写

1
2
3
4
# wsl
zsteg -a (文件名) #查看各个通道的lsb
-b的位数是从1开始的 zsteg zlib.bmp -b 1 -o xy -v
提取文件并导出 zsteg -e b1,r,lsb,xy 3.png > 123.jpg

信息藏在图片中有时候会看不出来,所以还是要用stegsolve.jar过一遍

cloacked-pixel

lsb隐写的可能是加密后的数据,i春秋最喜欢的cloacked-pixel

拉到kali/WSL里用cloacked-pixel命令解密出数据

1
python2 cloacked-pixel-master/lsb.py extract 0.png out.data f78dcd383f1b574b

0.png是隐写后的图片;out.data是隐写内容保存的位置;f78dcd383f1b574b是密钥

IDAT块隐写

拉到kali里用pngcheck -v 0.png检查IDAT

解压zlib获得原始数据

然后用010提取数据扔进zlib脚本解压获得原始数据

将异常的IDAT数据块斩头去尾之后使用脚本解压,在python2代码如下:

1
2
3
4
5
6
import zlib
import binascii
IDAT = "789C5D91011280400802BF04FFFF5C75294B5537738A21A27D1E49CFD17DB3937A92E7E603880A6D485100901FB0410153350DE83112EA2D51C54CE2E585B15A2FC78E8872F51C6FC1881882F93D372DEF78E665B0C36C529622A0A45588138833A170A2071DDCD18219DB8C0D465D8B6989719645ED9C11C36AE3ABDAEFCFC0ACF023E77C17C7897667".decode('hex')
result = binascii.hexlify(zlib.decompress(IDAT))
print (result.decode('hex'))
print (len(result.decode('hex')))

加上文件头爆破宽高得到新的图片

一般出问题的 IDAT Chunk 大小都是比正常的小的,很可能在图片末尾

如果不确定是哪一个有问题,可以尝试都提取出来,一个一个分析

可以使用 tweakpng 辅助分析,但是一般用010的模板提取分析就够了

apngdis_gui

一张png图片还可能是apng,直接用apngdis_gui跑一下,可以分出两张相似的png

CVE-2023-28303 截图工具漏洞

可以使用Github上大佬写好的工具一把梭,前提是需要知道原图的分辨率

stegpy隐写

stegpy 开源地址 下载好后直接用WSL输入以下命令并输入密码解密即可

也可以直接用 pip 安装: pip3 install stegpy

1
stegpy 1.png -p

JPG图片隐写

outguess隐写

项目地址:https://github.com/crorvick/outguess

1
2
3
4
#WSL安装
git clone https://github.com/crorvick/outguess
cd outguess
./configure && make && make install

加密

1
2
3
4
5
outguess -k “my secret key” -d hidden.txt demo.jpg out.jpg
#key:my secret key
#要隐藏的内容:hidden.txt
#原图:demo.jpg
#隐写后:out.jpg,隐写后会覆盖原图

解密

1
2
3
outguess -k “my secret key” -r out.jpg hidden.txt
#-k 后面跟的是解密的密钥
#hidden.txt是解密后数据保存的位置

F5-steganography-master(F5隐写)

项目地址:https://github.com/matthewgao/F5-steganography

1
2
3
4
5
#有密码的情况
java Extract beautiful.jpg -p passwd
#无密码的情况
java Extract beautiful.jpg
#解密出来的数据会放到F5文件夹下的output.txt中

JPHS隐写

有可能会有密码

导出步骤 Select File --> seek --> demo.txt --> Save the file

steghide隐写

1
2
#密码已知
steghide extract -sf filename -p passwd

在WSL或者kali里用Stegseek跑(字典在wordlist里)

1
2
3
4
5
6
7
8
9
10
11
12
#密码未知
可以用下面这个脚本爆破
#bruteStegHide.sh
#!/bin/bash

for line in `cat $2`;do
steghide extract -sf $1 -p $line > /dev/null 2>&1
if [[ $? -eq 0 ]];then
echo 'password is: '$line
exit
fi
done
1
2
#或者在WSL或者kali里用Stegseek跑(字典在wordlist里)
stegseek filename rockyou.txt

BMP图片隐写

宽高爆破

删除文件头,并保存为文件名.data,然后用GIMP打开修改宽高(比较方便)

或者直接用bmp爆破脚本跑 python script.py -f filename.bmp

1
#用这个脚本要注意对图片一个个使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
import time
import math
import argparse


parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,
help="输入同级目录下图片的名称")
args = parser.parse_args()

SAVE_DIR = os.getcwd()


def save_img(data, width=None, height=None, sqrt_num=None):
with open(os.path.join(SAVE_DIR, "fix_width.bmp"), "wb") as f:
f.write(data[:0x12] + width.to_bytes(4,
byteorder="little", signed=False) + data[0x16:])

with open(os.path.join(SAVE_DIR, "fix_height.bmp"), "wb") as f:
f.write(data[:0x16] + height.to_bytes(4,
byteorder="little", signed=False) + data[0x1a:])

with open(os.path.join(SAVE_DIR, "fix_sqrt.bmp"), "wb") as f:
f.write(data[:0x12] + sqrt_num.to_bytes(4,
byteorder="little", signed=False) * 2 + data[0x1a:])


def get_pixels_size(data):
bfSize = int.from_bytes(data[0x2:0x2+4], byteorder="little", signed=False)
bfOffBits = int.from_bytes(
data[0xa:0xa+4], byteorder="little", signed=False)
biBitCount = int.from_bytes(
data[0x1c:0x1c+2], byteorder="little", signed=False)
channel = biBitCount // 8
# 由于宽高都会被修改,所以我计算出来的Padding_size也不是正确的,没有意义
# padding_size = (4 - col * channel % 4) * row if col * channel % 4 != 0 else 0
# pixels_size = (bfSize - bfOffBits - padding_size) // channel
return (bfSize - bfOffBits) // channel


if __name__ == '__main__':
file_path = os.path.abspath(args.f)
if os.path.splitext(args.f)[-1] != ".bmp":
print("您的文件后缀名不为BMP!")
time.sleep(1)
exit(-1)

with open(file_path, "rb") as f:
data = f.read()
col = abs(int.from_bytes(data[0x12:0x12+4],
byteorder="little", signed=True))
row = abs(int.from_bytes(data[0x16:0x16+4],
byteorder="little", signed=True))
pixels_size = get_pixels_size(data)

width, height = pixels_size // row, pixels_size // col
sqrt_num = int(math.sqrt((pixels_size)))
save_img(data, width=width, height=height, sqrt_num=sqrt_num)

print("温馨提示:由于填充字节的问题,所以可能会偏差几个像素!")
print(f"1.修复宽度: {width}")
print(f"2.修复高度: {height}")
print(f"3.修复宽度高度为: {sqrt_num}")
time.sleep(1)

wbStego4open隐写

用wbStego4open直接decode

GIF隐写

分帧提取 在线网站:https://tool.lu/gifsplitter/

1
2
# 在Windows或者WSL中执行以下命令进行分离
ffmpeg -i filename.gif frame%04d.png

压缩包

压缩包密码在线破解网站

Tips:压缩包的密码可以是中英文字符和符号
​没有思路时可以直接纯数字/字母暴力爆破一下

zip文件结构

三部分:压缩文件源数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志

文件源数据区

HEX 数据 描述 010Editor 模板数据
50 4B 03 04 zip 文件头标记,看文本的话就是 PK 开头 char frSignature[4]
0A 00 解压文件所需 pkware 版本 ushort frVersion
00 00 全局方式位标记(有无加密),头文件标记后 2bytes ushort frFlags
00 00 压缩方式 enum COMPTYPE frCompression
E8 A6 最后修改文件时间 DOSTIME frFileTime
32 53 最后修改文件日期 DOSDATE frFileDate
0C 7E 7F D8 CRC-32 校验 uint frCrc

文件目录区

HEX 数据 描述 010Editor 模板数据
50 4B 01 02 目录中文件文件头标记 char deSignature[4]
3F 00 压缩使用的 pkware 版本 ushort deVersionMadeBy
0A 00 解压文件所需 pkware 版本 ushort deVersionToExtract
00 00 全局方式位标记(有无加密),目录文件标记后 4bytes ushort frFlags
00 00 压缩方式 enum COMPTYPE frCompression
E8 A6 最后修改文件时间 DOSTIME frFileTime
32 53 最后修改文件日期 DOSDATE frFileDate
0C 7E 7F D8 CRC-32 校验 uint frCrc

文件目录结束

50 4B 05 06 目录结束标记 char elSignature[4]
00 00 当前磁盘编号 ushort elDiskNumber
00 00 目录区开始磁盘编号 ushort elStartDiskNumber

rar文件结构

HEX 数据 描述 010Editor 模板数据
52 61 72 21 1A 07 00 rar 文件头标记,文本为 Rar!

Main block

HEX 数据 描述 010Editor 模板数据
33 92 B5 E5 全部块的 CRC32 值 uint32 HEAD_CRC
0A 块大小 struct uleb128 HeadSize
01 块类型 struct uleb128 HeadType
05 阻止标志 struct uleb128 HeadFlag

File Header

HEX 数据 描述 010Editor 模板数据
43 06 35 17 单独块的 CRC32 值 uint32 HEAD_CRC
55 块大小 struct uleb128 HeadSize
02 块类型 struct uleb128 HeadType
03 阻止标志 struct uleb128 HeadFlag

Terminator

HEX 数据 描述 010Editor 模板数据
1D 77 56 51 固定的 CRC32 值 uint32 HEAD_CRC
03 块大小 struct uleb128 HeadSize
05 块类型 struct uleb128 HeadType
04 00 阻止标志 struct uleb128 HeadFlag

压缩包伪加密

zip文件:

可以直接用ZipCenOp.jar修复:

java -jar ZipCenOp.jar r screct.zip

WinRAR打开、010改标志位、binwalk直接分离

如果压缩文件已损坏,则尝试用winrar打开,工具-修复压缩包

压缩源文件数据区:7-8位表示有无加密

压缩源文件目录区:9-10位表示是否是伪加密

一般这俩地方都是09 00的,大概率就是伪加密了(直接把第二个PK后的09改了就行)

rar文件:

第24个字节尾数为4表示加密,0表示无加密,将尾数改为0即可破解伪加密

CRC爆破(压缩包中文件比较小的时候)

使用CRC爆破需要文件大小小于等于18个字节

参考文章:https://blog.csdn.net/mochu7777777/article/details/110206427

可以使用CTFD中的两种脚本爆破一下(速度不同)

明文攻击

已知所有的明文或三段密钥

使用Advanced Archive Password Recovery破解

有和压缩包中的一样(CRC值一样)的文件时,压缩然后用AAPR进行明文攻击,这个攻击的过程可能需要几分钟

有了完整的三段密钥也可以使用这个工具破解密码

使用pkcrack破解

1
2
#将pkcrack作为系统命令使用
cp pkcrack /usr/sbin/pkcrack
1
pkcrack -c "README.txt" -p README.txt -C flag.zip -P README.zip
1
2
3
4
-C:要破解的目标文件(含路径)
-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)
-P:压缩后的明文文件
-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)
已知部分明文

利用bkcrack进行攻击

参考资料

1
2
https://www.freebuf.com/articles/network/255145.html
https://byxs20.github.io/posts/30731.html#%E6%80%BB%E7%BB%93

该利用方法的具体要求如下:

1
2
3
4
至少已知明文的12个字节及偏移,其中至少8字节需要连续。
明文对应的文件加密方式为ZipCrypto Store
Tips:进行明文攻击前要判断制作压缩包的压缩工具,然后对已知明文使用特定工具进行压缩,再进行明文攻击
例子:bkcrack -C \$R9EG7XR.zip -c flag.txt -k 958597ea b9f7740b 622aed5e -d flag.txt

如何判断压缩工具(参考自B神的博客)

压缩攻击 VersionMadeBy(压缩所用版本)
Bandzip 7.06 20
Windows自带 20
WinRAR 4.20 31
WinRAR 5.70 31
7-Zip 63

bkcrack常用参数

1
2
3
4
5
6
7
8
9
-c 要解密的文件
-P 已知明文所在的压缩包
-p 已知的明文部分
-x 压缩包内目标文件的偏移地址 部分已知明文值
-C 加密压缩包
-o offset -p参数指定的明文在压缩包内目标文件的偏移量
-k 后面加破解出的三段密钥
-d 后面加解密后数据的保存位置
-U 修改压缩包密码并导出 bkcrack -C flag.zip -c hint.jpg -k afb9fee3 f8795353 f6de1d4e -U out.zip 114514

例题:

1
2
3
4
#Tips:
xxd // xxd 命令用于用二进制或十六进制显示文件的内容
-r // 把xxd的十六进制输出内容转换回原文件的二进制内容
-ps // 以 postscript的连续十六进制转储输出,这也叫做纯十六进制转储
1)简单的加密文本压缩包破解
1
flag{16e371fa-0555-47fc-b343-74f6754f6c01}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#攻击步骤如下:
#准备已知明文
echo -n "lag{16e3" > plain1.txt #连续的8明文
echo -n "74f6" | xxd #额外明文的十六进制格式,37346636
#攻击,-o是偏移量
bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636
#由于时间较长,为防止终端终端导致破解中断,可以加点小技巧
bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log&
#后台运行,结果存入1.log
#加上time参数方便计算爆破时间
time bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log&
#查看爆破进度
tail -f 1.log
#使用该秘钥进行解密:
bkcrack -C flag_360.zip -c flag.txt -k b21e5df4 ab9a9430 8c336475 -d flag.txt
1
2
#-p 指定的明文不需要转换,-x 指定的明文需要转成十六进制
#提到的偏移都是指 “已知明文在加密前文件中的偏移”。
2)利用PNG图片文件头破解
1
2
3
4
5
6
#准备已知明文
echo 89504E470D0A1A0A0000000D49484452 | xxd -r -ps > png_header
#攻击
time bkcrack -C png4.zip -c 2.png -p png_header -o 0 >1.log&
tail -f 1.log
time bkcrack -C png4.zip -c flag.txt -k e0be8d5d 70bb3140 7e983fff -d flag.txt
3)利用压缩包格式破解
1
2
3
4
5
将一个名为flag.txt的文件打包成ZIP压缩包后,发现文件名称会出现在压缩包文件头中,且偏移固定为30。且默认情况下,flag.zip也会作为该压缩包的名称。
已知的明文片段有:
“flag.txt” 8个字节,偏移30
ZIP本身文件头:50 4B 03 04 ,4字节
满足12字节的要求
1
2
3
4
5
6
7
8
9
echo -n "flag.txt" > plain1.txt #-n参数避免换行,不然文件中会出现换行符,导致攻击失效
time bkcrack -C test5.zip -c flag.zip -p plain1.txt -o 30 -x 0 504B0304 >1.log&
tail -f 1.log
bkcrack -C test5.zip -c flag.zip -k b21e5df4 ab9a9430 8c336475 -d flag.zip
#但若想解密2.png,由于是ZipCrypto deflate加密的
#使用deflate算法压缩的文件,解码出来的是Deflate的数据流
#所以解密后需要bkcrack/tool内的inflate.py脚本再次处理
bkcrack -C test5.zip -c 2.png -k b21e5df4 ab9a9430 8c336475 -d 2.png
python3 inflate.py < 2.png > 2_out.png

Tips:如果这里用"XXXXX.txt"作为plaint1.txt无法破解出密钥,可以试试直接去掉后缀再作为plaint1.txt

例如:NKCTF2023——五年Misc,三年模拟

1
2
3
#echo -n "handsome.txt" > plain1.txt 破解失败
echo -n "handsome" > plain1.txt
time bkcrack -C test5.zip -c handsome.zip -p plain1.txt -o 30 -x 0 504B0304 >1.log&
4)EXE文件格式破解
1
2
EXE文件默认加密情况下,不太会以store方式被加密,但它文件格式中的的明文及其明显,长度足够。如果加密ZIP压缩包出现以store算法存储的EXE格式文件,很容易进行破解。
大部分exe中都有这相同一段,且偏移固定为64:

image

1
2
3
4
echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > mingwen
time bkcrack -C nc64.zip -c nc64.exe -p mingwen -o64 >1.log&
tail -f 1.log
bkcrack -C nc64.zip -c nc64.exe -k b21e5df4 ab9a9430 8c336475 -d nc64.exe
5)流量包pcapng格式解密
1
2
3
echo -n "00004D3C2B1A01000000FFFFFFFFFFFFFFFF" | xxd -r -ps > pcap_plain1
time bkcrack -C 3.zip -c capture.pcapng -p pcap_plain1 -o 6
bkcrack -C 3.zip -c capture.pcapng -k e33a580c c0c96a81 1246d892 -d out.pcapng
6)网站相关文件破解
1
2
3
robots.txt的文件开头内容通常是User-agent: * 
html文件开头通常是 <!DOCTYPE html>
xml文件开头通常是<?xml version="1.0" encoding="UTF-8"?>
1
2
3
echo -n '<?xml version="1.0" encoding="UTF-8"?>' > xml_plain
time bkcrack -C xml.zip -c 123/web.xml -p xml_plain -o 0 //注意相对路径
bkcrack -C xml.zip -c 123/web.xml -k e0be8d5d 70bb3140 7e983fff -d web.xml
7)SVG文件格式破解
1
2
3
4
5
6
7
8
9
#SVG是一种基于XML的图像文件格式
echo -n '<?xml version="1.0" ' > plain.txt
bkcrack -C secrets.zip -c spiral.svg -p plain.txt -o 0
#解密 Store算法 直接解密即可
bkcrack -C secrets.zip -c spiral.svg -k c4038591 d5ff449d d3b0c696 -d spiral_deciphered.svg
#解密 deflate算法
bkcrack -C secrets.zip -c advice.jpg -k c4038591 d5ff449d d3b0c696 -d out.jpg
#该文件使用了deflate算法压缩的,解码出来的是Deflate的数据流,因此须将其解压缩。
python3 inflate.py < out.jpge > flag.jpg
8)VMDK文件格式破解
1
2
3
echo -n "4B444D560100000003000000" | xxd -r -ps > plain2
time bkcrack -C Easy_VMDK.zip -c flag.vmdk -p plain2 -o 0
time bkcrack -C Easy_VMDK.zip -c flag.vmdk -k xxx xxx xxx -d flag.vmdk

有时候直接给你部分明文的情况(2023 DASCTFxCBCTF)

直接在bkcrack中使用以下命令即可,key是题目给的压缩包中被压缩文件的部分明文

1
bkcrack -C purezip.zip -c 'secret key.zip' -p key

直接给了加密压缩包中部分文件的情况

例题1 - 2023 古剑山-幸运饼干

  • 可以先把该文件用压缩软件压缩成一个压缩包,然后用 Advanced Archive Password Recovery 明文攻击试试看

  • 用压缩软件把该文件压缩成一个压缩包,然后使用 bkcrack 进行明文攻击

    为什么需要压缩成压缩包呢?因为如果不带上压缩包进行明文攻击的话会报下面这个错误

    1
    2
    3
    $ bkcrack -C flag.zip -c 'hint.jpg' -p hint.jpg
    bkcrack 1.5.0 - 2023-03-08
    Data error: ciphertext is smaller than plaintext.

    用 -P 参数带上压缩包后即可正确解密出密钥

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ bkcrack -C flag.zip -c hint.jpg -p hint.jpg -P hint.zip
    bkcrack 1.5.0 - 2023-03-08
    [14:37:27] Z reduction using 25761 bytes of known plaintext
    100.0 % (25761 / 25761)
    [14:37:29] Attack on 289 Z values at index 21821
    Keys: afb9fee3 f8795353 f6de1d4e
    100.0 % (289 / 289)
    [14:37:29] Keys
    afb9fee3 f8795353 f6de1d4e

    因此这种情况一定要记得将已有的文件用适当的压缩方法压缩成压缩包,然后用-P参数带上这个压缩包

例题1 - 2023 铁三决赛-baby_jpg

我们先从部分伪加密的压缩包中分离出了 serect.pdf,然后从PDF中 foremost 出了加密压缩包中的 sha512.txt

将 sha512.txt 压缩成 sha512.zip,然后使用下面的命令进行明文攻击即可:

其中 -C 后是要破解的压缩包,-c 后是压缩包中我们要破解的文件,-P 后是我们压缩好的压缩包,-p 后是我们已得的文件

1
2
3
4
5
6
7
8
9
$ bkcrack -C 00000218.zip -c 'sha512.txt' -P sha512.zip -p sha512.txt
bkcrack 1.5.0 - 2023-03-08
[16:14:25] Z reduction using 78 bytes of known plaintext
100.0 % (78 / 78)
[16:14:25] Attack on 104916 Z values at index 6
Keys: ed3fb6a9 1c4a7211 c07461ed
59.9 % (62867 / 104916)
[16:14:52] Keys
ed3fb6a9 1c4a7211 c07461ed

破解出密钥后,用 -U 参数修改压缩包密码并导出

1
2
3
4
5
$ bkcrack -C 00000218.zip -k ed3fb6a9 1c4a7211 c07461ed -U out.zip 111
bkcrack 1.5.0 - 2023-03-08
[16:15:44] Writing unlocked archive out.zip with password "111"
100.0 % (3 / 3)
Wrote unlocked archive.
在比赛中的使用记录

2022 西湖论剑zipeasy

1
bkcrack -C zipeasy.zip -c dasflow.zip -x 30 646173666c6f772e706361706e67 -x 0 504B0304 > 1.log &

2023 DASCTFxCBCTF

利用bkcrack反向爆破密钥

1
2
3
4
5
6
7
bkcrack -k e48d3828 5b7223cc 71851fb0 -r 3 \?b
#bkcrack 1.5.0 - 2023-03-08
#[17:47:50] Recovering password
#length 0-6...
#[17:47:50] Password
#as bytes: 8b e7 dc
#as text: ���

然后如果要对得到的密钥进行MD5加密,可以使用CyberChef(From Hex + MD5)

image

Tips:题目做不出来可以尝试多换几个压缩软件:Bandzip、Winrar、7zip、360压缩、2345压缩等

暴力破解(爆破时注意限制长度)

可以使用 Advanced Archive Password Recovery 进行爆破

(1) 如果知道部分的密码,可以使用掩码攻击,例如:???LiHua

(2) 没啥思路的时候可以直接用纯数字密码爆破看看,也可以用字典爆破

(3) 如果爆破的速度很慢,可以用 Passware Kit Forensic 2021 v1 (64-bit) 来爆破(也可以自定义字典)

连环套压缩包

可以用fcrackzip进行爆破或者使用CTFD中的脚本爆破

1
2
3
4
5
6
7
8
9
10
11
12
import zipfile
import re
file_name = 'pic/' + 'f932f55b83fa493ab024390071020088.zip'
while True:
try:
zf = zipfile.ZipFile(file_name)
re_result = re.search('[0-9]*', zf.namelist()[0])
passwd = re_result.group()
zf.extractall(path='pic/', pwd=re_result.group().encode('ascii'))
file_name = 'pic/' + zf.namelist()[0]
except:
print("get the result")

未知后缀的压缩包

可以多用几个压缩软件试试,比如Winrar 7z

分卷压缩包合并

1
copy /B topic.zip.001 + topic.zip.002+topic.zip.003+topic.zip.004+topic.zip.005+topic.zip.006 topic.zip

压缩包炸弹

很小的压缩文件,解压出来会占据巨大的空间,甚至撑爆磁盘
处理方法:010中直接编辑压缩包文件,看看是否藏有另一个压缩包

根据010中的模板修改了某些参数

有些题目可能会修改源数据中压缩包文件中被压缩文件的文件名的长度

源数据中被压缩文件名字的长度对不上也会导致解压后文件无法打开

所以…010的模板功能真的非常非常的好用!

image

压缩包密码是不可见字符

字节数很短的情况

直接写个Python脚本爆破即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import zipfile
import libnum

def solve():
# 在ASCII编码中,一个字符占用8位(1字节)
for i in range(256):
for j in range(256):
fz = zipfile.ZipFile('secret key.zip', 'r')
password = libnum.n2s(i) + libnum.n2s(j)
print(f"[+]正在尝试密码{password}")
try:
fz.extractall(pwd=password)
fz.close()
return password
except:
fz.close()
continue
return None

if __name__ == "__main__":
password = solve()
if password:
print(f"[+]压缩包解压成功,密码是{password}")
else:
print(f"[+]在该范围内找不到压缩包密码,压缩包解压失败")
字节数较长的情况

需要先把密码base64编码一下,然后再base64解码成byte类型作为密码

1
2
3
4
5
6
7
8
9
10
11
import base64
import pyzipper

target_zip = '1.zip'
outfile = './solved'

pwd = base64.b64decode(b'aEXigItjVOKAjEbigI8=')
# b'hE\xe2\x80\x8bcT\xe2\x80\x8cF\xe2\x80\x8f'
with pyzipper.AESZipFile(target_zip, 'r') as f:
f.pwd = pwd
f.extractall(outfile)

流量分析

USB流量分析

Alt键+数字键分析,可以获得ASCII码

image

 评论
评论插件加载失败
正在加载评论插件
访客数 访问量