写在前面

MISC的学习是极广的,很多都要学习,而记在博客上是最方便有效的方法了,可以随时翻阅

这篇博客会随着我的一点点学习而逐渐被填写,因此不会很快。。

各种文件头尾

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
.7z的文件头:37 7A BC AF 27 1C
.pyc的文件头:03 F3 0D 0A
.jpg的文件头:FF D8 FF E0 00 10 4A 46 49 46 00 01
.png的文件头:89 50 4e 47 0d 0a 1a 0a 文件尾:49 45 4E 44 AE 42 60 82
.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

我发现mc-office的头尾也是50 4B 03 04

各种加密

思路:

加密的方法有很多,要看是什么加密了

base加密

原理:

Base 编码(Base Encoding)是一种将二进制数据转换为可打印字符的编码方式。常见的 Base 编码有 Base64、Base32 和 Base16 等,它们的工作原理相似,只是使用的字符集和编码方式不同。

1.基本原理

Base 编码的核心原理是将一串二进制数据(字节)按照一定的规则分组,并将每组数据映射为一个字符。这样可以保证编码后的数据由可打印的字符组成,通常用于在文本格式中传输二进制数据。

Base64 为例,下面是其编码原理:

  1. 输入数据分组:将输入的二进制数据每 3 个字节一组,每个字节 8 位,总共 24 位。
  2. 划分为 4 组:将这 24 位数据分成 4 组,每组 6 位。例如,输入数据为 3 字节(24 位),经过分组后就变成 4 个 6 位的数据块。
  3. 字符映射:将每个 6 位的数据块映射到一个字符表。Base64 的字符表包括大小写字母(A-Z、a-z)、数字(0-9)和两个符号(+ 和 /)。总共有 64 个字符,所以叫 Base64。
  4. 输出结果:输出的是一个由这 64 个字符组成的字符串。如果原始数据的字节数不是 3 的倍数,Base64 编码会使用一个或两个 = 来填充,使得输出的字符数是 4 的倍数。

2.举个例子

以字符串 "Hello" 为例:

  1. "Hello" 转换为 ASCII 码:
    H e l l o72 101 108 108 111

  2. 转换为二进制:

    1
    01001000 01100101 01101100 01101100 01101111
  3. 按 3 字节(24 位)分组(不足补 0):

    1
    01001000 01100101 01101100 01101100 01101111 00000000
  4. 拆分为 6 位:

    1
    010010 000110 010101 101100 011011 000110 111101 000000
  5. 查 Base64 表:

    1
    S  G  V  s  b  G  8  =
  6. 最终 Base64 编码结果为:

    1
    SGVsbG8=

3.其他常见的 Base 编码

  • Base32:将每 5 个字节转为 8 个字符,使用 32 个字符(A-Z、2-7)。它的特点是比 Base64 更加健壮,对字母区分大小写的要求较低,通常用于限制字符集时(如避免使用特殊字符)。
  • Base16(Hex):将每个字节编码为两个十六进制字符,常用于表示十六进制数据。

4.总结

Base 编码的核心思想是将二进制数据映射为可打印字符,使得原本只能通过二进制传输的数据能够通过文本协议进行传输。不同的 Base 编码有不同的字符集,常见的有 Base64、Base32 和 Base16。

工具:

解密的时候要注意是不是换表的base

cyberchef

一个解密的网站

随波逐流

随波逐流支持换表base,多行base

其中有个base64隐写解密甚至可以把解密出来的脚本运行了

puzzlesolver

这个可以补全base32,64隐写

basecrack

先要装好工具

因为我给basecrack单独装了一个虚拟环境,所以运行时候要激活它

切换到目录

1
cd basecrack

激活虚拟环境

1
source venv/bin/activate

运行

1
python basecrack.py
2024-11-28 111731

就可以开始解密了。

如果想让他一直解密的话用

1
python basecrack.py -m

脚本

如果确信是base加密而以上方式都没有解密出来的话可以试试这个脚本

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
import base64
import re
import base91

def baseDec(text,type):
if type == 1:
return base64.b16decode(text)
elif type == 2:
return base64.b32decode(text)
elif type == 3:
return base64.b64decode(text)
elif type == 4:
return base64.b85decode(text)
elif type == 5:
return base91.decode(text.decode())
else:
pass

def detect(text):
try:
if re.match("^[0-9A-F=]+$",text.decode()) is not None:
return 1
except:
pass
try:
if re.match("^[A-Z2-7=]+$",text.decode()) is not None:
return 2
except:
pass
try:
if re.match("^[A-Za-z0-9+/=]+$",text.decode()) is not None:
return 3
except:
pass
try:
if re.match("^[A-Za-z0-9$%()*+,-./:;?@[\]^_`{|}~]+$",text.decode()) is not None:
return 4
except:
pass
try:
if re.match("^[^-\']+$",text.decode()) is not None:
return 5
except:
pass
return 5

def autoDec(text):
floor = 0
while True:
try:
code = detect(text)
text = baseDec(text,code)
floor += 1
print("第{0}层:\n".format(floor),text)
if not text:break
except:
break

if __name__ == "__main__":
# with open("Autopy/crypto/doc/form",'rb') as f:
# content = f.read()
content = "@iH<,{*;oUp/im\"QPl`yR*ie}NK;.D!Xu)b:J[Rj+6KKM7P@iH<,{*;oUp/im\"QPl`yR".encode()
#修改content内容
autoDec(content)

MD5加密解密

加密网站(适用于让你包上md5提交的): https://www.geekstool.com/tool/md5

凯撒加密

凯撒加密的原理是换位,我们需要注意换位的key会不会变化

如果key会变的话我们需要编写脚本来解密了

如果没有的话直接cyberchef或者随波逐流都可

brainfuck加密

注意对开头的内容有要求

-随波逐流里有

-网站:https://www.splitbrain.org/services/ook

Ook! Obfuscation加密

-网站:https://www.splitbrain.org/services/ook

serpent加密(蛇对称加密算法)

-网站:http://serpent.online-domain-tools.com

颜文字加密(aaencode/jjencode/ppencode/uuencode/xxencode)

-aaencode随波逐流里面有

-其他的可以用在线网站http://www.hiencode.com/

emoji-aes加密

解密需要密钥

类似于

1
🙃💵🌿🎤🚪🌏🐎🥋🚫😆😍🔬👣🖐🌏😇🥋😇😊🍎🏹👌🌊☃🦓🌏🐅🥋🚨📮🐍🎈📮📂✅🐍⏩⌨🎈😍🌊😇🐍☺💧🥋🍌🎤🍍😇👁🦓😇🍍📮📂🎅😡🍵✖✉🏹⌨🍵🎤😆🍵🚹🏹🍎🚨ℹ☃👑🎤🚪💵😎😀😎🔬💵🦓🏹👉🦓✖😀🐘🔪⌨🎈🥋👌🍌🚹😂✉🍎🍌🏎👌🏹💵👌👁🎃🗒

这种全是emoji的加密,使用在线网站: emoji-aes

注意base100也是emoji这样的

音符加密

解密网站: 文本加密为音乐符号,可自设密码|文本在线加密解密工具

手机九宫格加密

第一种

每组数字只有两个,类似于82 73 42 31 22 31 33 41 32这种

对照表如下:

密码 明文 密码 明文
11 : 61 m
12 _ 62 n
13 - 63 o
21 a 71 p
22 b 72 q
23 c 73 r
31 d 74 s
32 e 81 t
33 f 82 u
41 g 83 v
42 h 91 w
43 i 92 x
51 j 93 y
52 k 94 z
53 l

第二种

类似于

1
999*666*88*2*777*33*6*999*4*4444*777*555*333*777*444*33*66*3*7777

这种

直接手机九宫格上打就好了,次数对应长按的第几个。

AES-ECB加密

可以用cyberchef

可以用脚本,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import base64
from Crypto.Cipher import AES
def aes_decrypt(data, key):
key = key.encode('utf-8')+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
cipher = AES.new(key, AES.MODE_ECB)
decrypted = cipher.decrypt(base64.b64decode(data))
return decrypted

if __name__ == "__main__":
data = 'Kln/qZwlOsux+b/Gv0WsxkOec5E70dNhvczSLFs+0pkHaovEOBqUApBGBDBUrH08' #加密的文本
for i in range(100000,999999):
key = str(i)
res = aes_decrypt(data=data,key=key)
res = str(res)
if 'flag' in res or 'DASCTF' in res: #关键词
print(f"key:{key}")
print(f"flag:{res}")
break

alphuck代码加密

一种怪异的编程语言

内容类似于

1
iiciccepepceaiiiaiaiaicccsascciijceeeeeejccijjccjcejaajaajcccjeeejaajaaijcccej

在线网站: alphuck在线运行,在线工具,在线编译IDE_w3cschool

autokey加密

一种加密方式,python2运行

项目地址: hotzzzzy/breakautokey: breakautokey

需要修改break_autokey.py里面密文的值然后运行

ToyCipher加密

一种加密方式,对照表: 301.pdf

脚本转化:

1
2
3
4
5
6
7
8
9
10
11
12
cipherdic = {'M':'ACEG','R':'ADEG','K':'BCEG','S':'BDEG','A':'ACEH','B':'ADEH','L':'BCEH','U':'BDEH','D':'ACEI','C':'ADEI','N':'BCEI','V':'BDEI','H':'ACFG','F':'ADFG','O':'BCFG','W':'BDFG','T':'ACFH','G':'ADFH','P':'BCFH','X':'BDFH','E':'ACFI','I':'ADFI','Q':'BCFI','Y':'BDFI'}
ciphertext = ''
with open('signin.txt','r') as f:
#读取signin.txt
f = f.read()
for i in range(0,len(f),4):
block = f[i:i+4]
for j in cipherdic:
if block == cipherdic[j]:
ciphertext += j
#print('{}: {}'.format(block,j))
print(ciphertext)

奇奇怪怪的加密

有一些奇怪的加密可以尝试去随波逐流找找看

随波逐流/其他工具/更多图形密码(在线)

TXT文本隐写

思路:

看是什么隐写了,是NTFS?还是snow?还是什么

NTFS交换数据流(简称ADS)

NTFS交换数据流(简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,除了主文件流之外还可以有许多非主文件流寄宿在主文件流中,而我们无法查看到非主文件数据流,因文件夹大小始终显示0

注意ntfs的压缩包要用WinRAR解压,否则可能解压不出来ntfs流

以下是进行文件流计生和查看的方法,以后在windows命令行下查看文件,都用 dir /r

寄生一:

echo 写入内容>>宿主文件:交换数据流文件(寄生文件)

echo ever>>1.txt:2.txt

2.txt为echo创建出交换数据流文件,ever在2.txt中

寄生二:

type 交换数据流文件(寄生文件)>>宿主文件夹:交换数据流文件(寄生文件)

type 2.txt>>temp:2.txt

temp为空文件夹,执行后2.txt寄生在temp文件夹上

type a.jpg>>temp:a.jpg

temp为空文件夹,执行后a.jpg寄生在temp文件夹上

查看:

notepad 宿主文件:交换数据流文件(寄生文件)

notepad 1.txt:2.txt

查看图片文件:

mspaint 宿主文件:交换数据流文件(寄生文件)

notepad a.jpg:b.jpg

过滤

dir /r | findstr $DATA (过滤DATA字符串)

例题可以看BUUctf的 [SWPU2019]我有一只马里奥

网站讲解: https://zhuanlan.zhihu.com/p/654643812

工具:NtfsStreamsEditor或AlternateStreamView

snow加密

需要密码,当然也可以无密码解密

1
snow.exe -p password -C encoded.txt

零宽字符

零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式。它们在文本中占有位置却不显示

零宽字符的特征还是蛮明显的,发现了就直接网站解密就好: Unicode Steganography with Zero-Width Characters

或者随波逐流里面有零宽字符解密。

字频统计

有一些txt里面是一堆东西比如字母之类的,实际上是要我们统计字频

其实一般来说有大量的文本内容就应该试试是不是统计字频

可以使用puzzlesolver

空格-Tab隐写

一个txt全选会发现有很多空白内容

sunblime/notepad++打开会发现有很多空格和Tab

这种一般是莫斯密码,手敲一下然后转化就行

encrypto文件

一个加密软件,需要密钥

解密这种文件的话需要加上.crypto后缀名,否则是加密

这个加密方式对文件的16进制内容要求很严格,如果在确信是这种加密和密钥正确的情况下跑了很久都没出的话,可以试试010打开文件看看16进制有没有问题(比如有干扰的字符的话就跑不出来)

火狐登录凭证

一般是logins.json

建议使用firepwd:lclevy/firepwd: firepwd.py, an open source tool to decrypt Mozilla protected passwords

安装库(建议在虚拟机上搞)

1
2
plaintext
pip install -r requirements.txt

如果crypto报错(kali上搞)

1
2
3
plaintext
pip uninstall crypto pycryptodome
pip install pycryptodome

然后

1
2
plaintext
python firepwd.py logins.json

3D打印命令

命令大概长这样

屏幕截图 2025-03-09 192006

3D打印的命令,命令大全: 3D打印gcode命令大全及解析_move exceeds maximum extrusion-CSDN博客

改后缀为gcode,在线查看网址: gcode viewer - online gcode viewer and analyzer in your browser!

如果看不清的话 在2D渲染里面把干扰项去掉就行

不同编码

不同编码下的txt内容如果选择不正确的编码的话肯定看不出来

如果看到乱码的话可以多试试其他编码,如utf16,utf8,ebcdic等等

1.EBCDIC编码: 什么是 EBCDIC 收集了有关计算机普及的最新文章 - Hatena

在010的视图里面选择EBCDIC,就能看到了

反转文本

有时候遇到打开文本,能观察出这个文本是反转过的(因为发现了文件头或者别的什么东西)

可以使用puzzlesolver的反转或者试试cyberchef的reverse项(没那么好用,建议一般找ai跑脚本)

或者使用脚本反转回来,这里脚本仅处理一种情况,最终还是得ai跑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
with open('E:/python3.7/1.txt', 'r', encoding='utf-8') as file:  #记得改路径
text = file.read()

# 将文本按空格分隔成列表
hex_numbers = text.split()

# 反转每个十六进制数字,并转换为大写
reversed_hex_numbers = [num[::-1].upper() for num in hex_numbers]

# 每16个数字分为一行
lines = []
for i in range(0, len(reversed_hex_numbers), 16):
line = ' '.join(reversed_hex_numbers[i:i+16])
lines.append(line)

# 将所有行连接成最终文本
reversed_text = '\n'.join(lines)

with open('E:/python3.7/reversed_document.txt', 'w', encoding='utf-8') as file:
file.write(reversed_text)

sunblime/notepad++

有时候什么东西都看不到,感觉类似于无字天书。可以复制进sunblime看看

而且感觉sublime text与notepad++一样,都是查看东西的,记事本打不开的话可以试试,有很多莫名奇妙的后缀文件一般都可以打开。

图片题

思路:

可以先拖进随波逐流看看

没有再010看看有无隐写

实在不行看看文件属性里有没有备注

压缩了宽高

有些题目会压缩图片宽高,我们需要爆破出来,jpg可以乱改宽高,png不行,需要知道原本的宽高。

1.随波逐流把文件拖进去会自己分析,如果压缩了宽高会自己爆破回来,很好用

2.010可以自己修改宽高

png爆破crc脚本

实测这个脚本在宽高比较低的时候好用,超过1000就不好用了,爆破得很慢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#使用python3爆破png图片的宽高数据
import os
import binascii
import struct

for i in range(20000):#一般 20000就够
wide = struct.pack('>i',i)
for j in range(20000):
high = struct.pack('>i',j)
data = b'\x49\x48\x44\x52' + wide+ high+b'\x08\x02\x00\x00\x00'
#因为是 Py3,byte和str型不能直接进行运算,要写把 str写 b'...'。不然把 wide和 high写成 str(...)

crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x90BECB72: # 0x90BECB72是这个 png文件头的 CRC校验码,在 21~25byte处
print('\n\n',i,j,crc32) #0x 后的数字为十六进制中crc位置的代码(winhex左016,13-下一行的0)
print(type(data))
exit(0)
print(i,end=' ')

stegdetect

这个是用来检查图片是什么隐写的

我这里下的是windows版本,对应目录下cmd

1
stegdetect.exe  图片路径

outgruss隐写

1
outguess -k ‘key’ -r 加密后的图片.jpg -t 明文.txt

F5-steganography

题目可能会提示关于刷新一类的字眼

装好工具后

1
cd F5-steganography

1
java Extract 1.jpg -p 123456 #-p后接f5的key

有时候报错需要我们加上

1
--add-opens java.base/sun.security.provider=ALL-UNNAMED

steghide

直接跑

1
2
steghide extract -sf stg.jpg
或steghide extract -sf filename -p passwd

stegseek

1
stegseek --seed example.jpg

pngcheck——png图像修复

检查png的chunk

1
pngcheck -v decode.png

如果检查出来如 invalid chunk name “0000” (30 30 30 30)

就去010把对应的chunk 0000 修改为 IDAT

oursecret隐写

一种隐写方式,需要密码。

特征是010打开会发现有一个多余的部分,并且开头是9E 97 BA 2A

binwalk和formost提取

如果有文件隐写在图片里面,可以尝试binwalk和formost提取一下

附一个图片题分析网站: Aperi’Solve ,也不知道有没有用()

silghteye隐写

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

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

下载地址: SilentEye - Steganography is yours

LSB隐写

stegsolve

lsb是利用人眼看不到的原理在最低位隐写内容

stegsolve可以查看图片的LSB通道,如果是最低位lsb隐写的话可以stegsolve一下

运行stegsolve

1
java -jar stegsolve.jar

需要电脑配置好了java环境变量

stegsolve可以看到最低位的一些数据,然后手动save bin,再用010转化

zsteg——无密钥

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

感觉stegsolve更好用

cloacked-pixel——有密钥

1
cd cloacked-pixel

1
2
3
4
python2 lsb.py extract encoded.png result.txt 123456 
#encoded.png 是加密的图片
#result.txt是解密后的文档,不确定格式的话可以改成out.data
#123456是密钥

最后

1
cat result.txt

盲水印

用puzzlesolver的fft(傅里叶变换)

双图盲水印也可以puzzlesolver

提取等距像素点

特征:放大图片后看到一个个小的像素点

提取方法1:PS

2024-12-08 170926

将宽度高度/10 重新采样选择 临近(硬边缘)

或者在调宽高的时候用鼠标滚轮来调,能更精细一点

但是实测出来效果不佳,得到的图片很糊

方法二:脚本

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
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.imshow(new_img)
cv2.imwrite(f"_{file_name}", new_img)
print("已保存到运行目录中...")
else:
print("参数-p或参数-n或参数-size, 输入错误!")

python脚本跑的更精确一点,需要知道图片像素起始位置和结束位置,以及像素之间的间距(可以在PS里知道)

输入以下代码:(要注意有时候跑不出来可以复制到桌面上试试)

1
2
3
4
python get_pixels.py -f comeon.png -p 0x0+3828x2148 -n 12x12
# comeon.png 是待解密图片
# 0x0 是图片里像素点起始位置,3828x2148 是图片里像素点结束位置
# 12x12 是图片的像素点间距

这个脚本跑出来更精细一点,也更推荐

cimbar

对照表(简单的),项目地址: https://github.com/sz3/cimbar

2024-11-28 115212

exiftool分析图片信息,如GPS

查看信息,记得要在对应目录下开终端

1
.\exiftool 1.jpg

查看GPS

1
.\exiftool -gps:all 1.jpg

Arnold猫脸变换

参考链接: https://1cepeak.cn/post/arnold/

解密需要提供打乱次数,a,b 。

加密 / 解密代码:

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
66
67
68
69
70
71
72
# -*- coding: UTF-8 -*-

import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image

img = cv2.imread('flag.png')

if img is None:
print("图像加载失败,请检查文件路径或格式")
exit()

def arnold_encode(image, shuffle_times, a, b):
""" Arnold shuffle for rgb image
Args:
image: input original rgb image
shuffle_times: how many times to shuffle
Returns:
Arnold encode image
"""
# 1:创建新图像
arnold_image = np.zeros(shape=image.shape)

# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w

# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = (1*ori_x + b*ori_y)% N
new_y = (a*ori_x + (a*b+1)*ori_y) % N

# 像素赋值
print(image[ori_x, ori_y, :])
print(arnold_image[new_x, new_y, :])
arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :]

cv2.imwrite('flag_arnold_encode.png', arnold_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return arnold_image

def arnold_decode(image, shuffle_times, a, b):
""" decode for rgb image that encoded by Arnold
Args:
image: rgb image encoded by Arnold
shuffle_times: how many times to shuffle
Returns:
decode image
"""
# 1:创建新图像
decode_image = np.zeros(shape=image.shape)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w

# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = ((a * b + 1) * ori_x + (-b) * ori_y) % N
new_y = ((-a) * ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]

cv2.imwrite('flag.png', decode_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return decode_image

# arnold_encode(img, 1, 2, 3)
arnold_decode(img, 1, 29294, 7302244)

如果报错如下:

decode_image = np.zeros(shape=image.shape) AttributeError: ‘NoneType’ object has no attribute ‘shape’

可以修改如下:

1
2
# 1:创建新图像,指定 dtype 为 uint8
arnold_image = np.zeros(shape=image.shape, dtype=np.uint8)

色彩图提取颜色值

一般会给一张图片,里面有几种颜色

我们可以使用ps-取色器来提取其中的颜色的RGB的16进制值

屏幕截图 2025-03-09 184022

然后拼接转ascii

apng/bpg

这种图片一般的图片编辑器打不开

1.apng

apng简介: 科普(APNG) - 哔哩哔哩

可以使用firefox打开

2.bpg

地址: 发行版 Simple BPG Image viewer · asimba/pybpgviewer

GIF

gif一般是拆分gif

以及帧间隔里面可能藏东西

使用puzzlesolver即可

二维码

[!NOTE]

扫描二维码实用排行:

T0:Binary EyeUmi-OCR

T0.5:在线网站

T1:CQR

T2:微信、夸克等

特殊:中国编码app、半张二维码手动补全:QRazyBox - QR Code Analysis and Recovery Toolkit

.

1.得到的二维码可以用CQR扫一下,或者微信扫一下

在线二维码解码网站: https://qrcode-decoder.com

如果以上都没扫出来的话可以手机上下一个Binary Eye扫一下,或者用Umi-OCR(没想到吧这个也能扫二维码)试试看

注意汉信码扫不出来,需要去下中国编码app来扫(又称中国的二维码,特点就是四个角,且左下角方向是反的。)

汉信码例子长相:

屏幕截图 2025-02-20 200323

2.二维码也容易出拼接题目。如果是拼接题的话可以用PS或者PPT(修复同理)

拼图题

一般来说是碎的图片修复一下,有两种方式

1.PS/PPT

可以用ppt来拼接图片,如果不行就用ps,需要ps的熟练度

2.gaps/Puzzle-Merak

如果是一个文件夹下面多个碎掉的图片,我们先把他们拼成一张的

1
2
3
4
5
montage *.PNG -tile 10x12 -geometry +0+0 out.png
*.png表示匹配所有图片(这里也可以换成.jpg)
-tile表示图片的张数
-geometry +0+0表示每张图片的间距为0
合成后要先查看图片的宽高(宽高要相等,不相等要用PS调整)

然后就能得到一张全是碎图片拼接起来的图片了,顺序此时还没恢复过来。

①gaps

png的

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 将拼图还原为图像

jpg的

1
2
3
4
5
6
gaps --image=flag.jpg --generations=50 --population=180 --size=125 --verbose

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

②Puzzle-Merak

注意新建的时候要看好图片的像素大小!

选择脚本-自动拼接(gaps)

这里需要我们填写generation、population、size 并用分号分开

–generations 遗传算法的代的数量

–population 个体数量

–size 拼图块的像素尺寸

PDF题

编辑pdf

例如那种把图片底下有东西的题目

-在线网站 https://tool.lu/pyc/

或者可以尝试使用pdf转word,然后编辑word

音频题

思路:

拿到不管三七二十一先拖进audacity看一下

摩斯密码

看频谱图的时候如果发现是摩斯密码我们直接对着摩斯密码手敲解密

拨号音隐写——DTMF

听着像是在拨号一般的声音,频谱图发现

2024-11-28 115211

类似这样的是DTMF隐写

需要我们手敲

把最高和最低一一对应

[!NOTE]

注意DTMF中频率只有697 Hz、770 Hz、852 Hz、941 Hz、 1209 Hz、1336 Hz、1477 Hz 和 1633 Hz

上图手敲得到

1
1336-697 1336-941 1336-697 1209-770 1336-941 1477-852 1477-697 1336-941 1336-697 1336-941 1336-697 1209-770 1209-697 1209-697 1336-941 1477-697

然后复制进网站解密即可: https://www.dcode.fr/dtmf-code#:~:text=A DTMF code for dual-tone multi-frequency

也可以试着把音频直接拖进随波逐流分析,或者在线网站: Detect DTMF Tones

SSTV慢扫描

github项目: https://github.com/colaclanth/sstv

1
sstv -d audio_file.wav -o result.png

注意解码出来是一张图片

然后查看图片

1
2
eog result.jpg 
或者v3m result.jpg

如果github的sstv扫不出来的话可以使用RX-SSTV

项目下载地址: https://www.qsl.net/on6mu/rxsstv.htm

可以配一个虚拟声卡使用,当然也可以直接扬声器。

deepsound

如果把音频拖进deepsound解密要密码的话一般就是deepsound隐写

密码看有没有其他地方得到

或者利用deepsound2john.py得到这个音频文件的哈希值后再john破解

silghteye隐写

当然音频也可以slighteye隐写,默认密码是silghteye

窄带FM调制

一般拿到文件是GNU Radio流图的配置,它描述了一个无线通信系统的信号处理过程,包括信号生成、滤波、调制、解调等步骤。

利用 GNU Radio打开

1
gnuradio-companion file_name.grc

PT2242信号

即电单车的解锁信号

前面4bit表示同步码,中间的20bit表示地址码,后面的4bit表示功能码,最后一位是停止码。

我们直接以时间的长短来表示0和1,打出二进制就好

ZIP题

思路:

zip有密码先看是不是伪加密,再看能不能爆破出来,要不要明文攻击,有没有注释,还有可能是脑洞。。

手动修复zip文件可以看看 其他 && 工具里的 010editor .zip模板对照表

伪加密

压缩源文件数据区:7-8位是frFlag

压缩源文件目录区:9-10位是deFlag

一般的出题人会修改这两个地方为奇数,从而显示出伪加密的样子

一般这俩地方都是09 00的,大概率就是伪加密了,具体可看zip文件结构

详细可以见我这篇博客 关于ZIP伪加密 | MetaVi

省流版:

工具 建议/判断位置
010 建议两个区都修一下
bandizip/winrar 判断dirEntry区中的deflag位
7zip 判断record区的frFlag位
随波逐流修复伪加密 只修改dirEntry区中的deflag位,不管frFlag位
ZipCenOp 不好用!

直接爆破

1.archpr

如果已知zip的密码很弱可以直接使用archpr来爆破密码

实际上感觉这个也用的比较多

注意archpr不支持rar5的爆破

2.fcrackzip

kali的工具

1
2
3
4
5
6
fcrackzip -u -v -D -p PASSWORD_FILE ZIP_FILE
#-u 表示使用暴力攻击模式
#-v 表示详细输出
#-D 表示使用字典攻击模式
#-p PASSWORD_FILE 表示指定密码字典文件
#ZIP_FILE 表示要破解的 ZIP 文件

我没怎么用过,感觉应该没有archpr好用

3.passwarekit

也可以用这个工具,比archpr好用,这个能爆破许多东西

4.rar5爆破

rar5爆破可以使用rar2john+hashcat

1
rar2john 1.rar

会得到哈希值

然后hashcat爆破

1
2
.\hashcat.exe -m 13000 -a 3 rar_hash GW?a?a?a?a
#修改这个rar_hash,windows下hash值不用加引号,kali下加引号

CRC32爆破

项目地址: https://github.com/allblue147/zip-crc-tools

crc爆破是里面文件很短,一般只有几字节的情况下

1
python .\main.py -f decode.zip

特别需要注意的是要保证 zip 及里面 txt 的名字不能出现中文,有的话重命名一下

掩码爆破

已知部分明文,而且知道密钥的位数的情况下使用掩码爆破

利用archpr进行掩码爆破,不知道的部分改为 ? (注意是英文的问号)

多个压缩包脚本解压

1.多个压缩包带密码

适用于有多个压缩包,而且密码是压缩包的名字

当然此类的压缩包还有很多,需要很多脚本,可以尝试ai跑

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
import os
import zipfile


def extract_and_store_final_file(initial_zip_path, target_dir):
if not os.path.exists(target_dir):
os.makedirs(target_dir)

current_zip_path = initial_zip_path

password = os.path.basename(initial_zip_path)[:4]

while True:
with zipfile.ZipFile(current_zip_path, 'r') as zip_ref:
files = zip_ref.namelist()
file_name = files[0]
next_zip_name = os.path.join(target_dir, file_name)
try:
zip_ref.extractall(target_dir, pwd=bytes(password, 'utf-8'))
print(f"Extracted {file_name} to {target_dir} using password {password}")
except RuntimeError as e:
print(f"Error extracting {file_name}: {e}")
break

if file_name.endswith('.zip'):
current_zip_path = next_zip_name
password = file_name[:4]
else:

print(f"The final file is {file_name}, stored in {target_dir}")
break



initial_zip_path = '0573.zip' #第一个解密的压缩包名称
target_dir = 'flag' #放进的文件夹
extract_and_store_final_file(initial_zip_path, target_dir)

2.压缩包套娃,无密码

bash脚本:

1
while [ "`find . -type f -name '*.tar.xz' | wc -l`" -gt 0 ]; do find -type f -name "*.tar.xz" -exec tar xf '{}' \; -exec rm -- '{}' \;; done;

一些tips

1.如果是连环套压缩包而且有zips,rar,7z等格式的小心是后缀换成摩斯密码解密。

2.空白名文件:出题人可能会把里面文件名字改为空白的,这样bandizip就解压不了了,多试试7zip解压吧!

3.多用用010的模板功能来看压缩包

明文攻击

明文攻击的压缩方式是store,如果是store的话一般就是需要明文攻击

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中的位置)

三段密钥已知了的话也可以用Advanced Archive Password Recovery

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.已知部分文件里的部分明文

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

已知的部分明文可以是zip的文件名字

2.已知一个zip里的一个文件的全部内容

例如一个zip里包含 flag.txt 和 md5.txt,可以

1
2
3
bkcrack -C 222.zip -c md5.txt -P 11.zip -p flag.txt
# 222.zip是待解密zip,md5是已知的txt
# 新建一个flag.txt,内容是md5一样的,打包成11.zip

或者可以

1
2
bkcrack -C 222.zip -c important-md5.txt  -p flag.txt
# 不打包成11.zip

就可以明文攻击三段密钥了。

3.已知三串密钥

=>>拿到了三串密钥之后可以改加密密码另存文件

1
2
3
4
bkcrack -C 222.zip -k 119be489 086fed79 8cbf1ed7 -U out.zip 1234
# 222.zip是待解密的zip
# -k后面跟的是三段密钥
# -U 表示转出为out.zip,密码是1234

或者爆破出原本密码(知道密码长度)

1
2
3
4
bkcrack -k 119be489 086fed79 8cbf1ed7 -r 11 \?b
# -k后面跟的是三段密钥
# 11 是已知的密码的长度
# \?b表示尝试所有可打印字符,\?l是所有小写字母,\?u是所有大写字母,\?d是所有数字,\?s是所有特殊字符,\?a是字母加数字(等同?l?u?d),\?p是ascii字符(等同?l?u?d?s)

不知道长度也可以爆破

1
bkcrack -k 119be489 086fed79 8cbf1ed7 -b \?b

流量分析题

思路:

先导出一下http,tcp,ftp看一下有没有什么东西,没有再过滤,一个个查看tcp流

如果有东西可以保存下来。

有的是键盘流量和鼠标流量,注意辨别。

如果没思路的话可以试试foremost或者binwalk一下

更多流量分析可以看这个 Network Traffic Analysis | MetaVi

常用命令

过滤post

1
http.request.method==POST

过滤get

1
http.request.method==GET

统计ip:

利用wireshark的统计-IPv4 Statistics-ALL Address功能可以查看IP的数量大小

TLS加密

一般来说这种加密是你看不到http等流量,需要文件等把他们解密出来才能看到

解密方法:

1
2
3
4
私钥文件
编辑->首选项->Protocols->TLS->edit->+号->Key File->输入ssc.key->OK
或者日志文件
编辑->首选项->Protocols->TLS->加载日志文件((Pre)-Master-Secret log)

就能看到了

log文件一般格式

第一种(rsa私钥):

1
2
3
-----BEGIN RSA PRIVATE KEY-----
123
-----END RSA PRIVATE KEY-----

第二种:

1
2
3
4
5
CLIENT_HANDSHAKE_TRAFFIC_SECRET <ClientHello随机数> <密钥>
SERVER_HANDSHAKE_TRAFFIC_SECRET <ClientHello随机数> <密钥>
CLIENT_TRAFFIC_SECRET_0 <ClientHello随机数> <密钥>
SERVER_TRAFFIC_SECRET_0 <ClientHello随机数> <密钥>
EXPORTER_SECRET <ClientHello随机数> <密钥>

(第二种的log文件编辑时记得不用加<>)

SQL注入——布尔盲注

它是用ascii码的大小比较来判断库名、表名、字段名和字段值的内容的

用二分法来爆破得出库里内容的

可以试着先过滤一下http流量,再/文件/导出分组解析结果/AS CSV,把流量导出成表格。看得更清楚。

一般来说,前面的内容是hacker来判断数据库名、表名、字段名的,我们可以直接拉到最下面来看。

因为用的是二分法,所以在对一个字符进行bool判断时,被重复判断的ASCII值就是正确的字符。

我们需要找到被重复判断的flag的ascii转化。

NTML流量分析(SMB流量)

我们需要的是这些东西

1
username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response

有两种方式

1.tshark

tshark可以获得username::domain:ServerChallenge:NTproofstring:,但是没有modifiedntlmv2response

命令(tshark是kali自带的)

1
tshark -n -r eztraffic.pcapng -Y 'ntlmssp.messagetype == 0x00000003' -T fields -e ntlmssp.auth.username -e ntlmssp.auth.domain -e ntlmssp.ntlmv2_response.ntproofstr -e ntlmssp.auth.sesskey -e smb2.sesid

接下来还是要回到流量里找modifiedntlmv2response,这里顺便讲了第二种方法

2.流量里找

过滤这个

1
ntlmssp

找到NTLMSSP_AUTH 包 打开流量包中的 Security Blob层 复制用户名、域名

然后过滤

1
ntlmssp.ntlmserverchallenge

查找NTLM Server Challenge字段,通常这个数据包是在NTLM_Auth数据包之前,将该值作为十六进制字符串复制到文本文档

最后需要的modifiedntlmv2response仍然在NTLM_Auth

需要我们在里面找到NTLMv2 Response

除了NTProofStr以外的就是我们要找的modifiedntlmv2response了(注意这里复制hex值)

==>得到的所有东西需要以

username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response

形式保存到txt文本里,然后使用hashcat爆破

1
2
3
.\hashcat -m 5600 hash.txt rockyou.txt
# 5600 表示NetNTLMv2模式
# rockyou是github上找的字典,还挺大

就能拿到密码了。

USB流量

usb流量还是蛮好辨别的:键盘流量是8字节的,鼠标是4字节。

可以先用tshark提取

1
2
3
#这个格式为 usbhid 
tshark -r keyboard.pcapng -T fields -e usbhid.data > usbdata.txt
#keyboard.pcapng是被提取的流量

或者

1
2
3
4
5
6
7
#这个格式是 usb.capdata.
#提取数据的命令,这里用正则表达式剔除了空行
tshark -r usb.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
# -r 指定了需要读取的文件
# -T 表示仅仅输出所选字段
# -e 指定提取的字段
# 在sed中使用正则表达式过滤掉所有空行(其中 ^\s*$ 匹配空行,`d` 表示删除)

键盘流量

键盘流量有标准——hid键盘标准: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

如果看的烦的话也可以去网上搜相关的标准

/

或者我们可以去下一个 UsbKeyboardDataHacker——恢复击键信息

地址 GitHub - WangYihang/UsbKeyboardDataHacker: USB键盘流量包取证工具 , 用于恢复用户的击键信息

为此我还安装了虚拟环境

先激活环境

1
source UsbKeyboardDataHacker/bin/activate

再切

1
cd UsbKeyboardDataHacker

分析(注意要在同目录下)

1
python3 UsbKeyboardDataHacker.py --input key.pcap

TTL加密

看到的txt类似于这种:

屏幕截图 2025-02-14 181234

实际上这是TTL加密

[!NOTE]

TTL加密:
简单来说就是,图中63,127,191,255转化为二进制的值分别为 00111111,01111111,10111111,11111111。

发现只有前两位不同,TTL加密就是利用前两位进行加密,将每个前两位重新进行合并,8位为一组。

所以TTL加密的解密方法:

1,将所有前两位合并为8位,并且每八位一组。

2,将上面的每组转化为十六进制的字符

解密脚本:

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
import binascii

f = open('1.txt', "r") #输入的txt
str = ''
Binary = ''
number = ''
while 1:
num = f.readline()
if not num:
break
if num.rstrip() == '63': # 去掉每行后面的空格
Binary = '00'
elif num.rstrip() == '127':
Binary = '01'
elif num.rstrip() == '191':
Binary = '10'
elif num.rstrip() == '255':
Binary = '11'
str += Binary
for i in range(0, len(str), 8):
number += chr(int(str[i:i + 8], 2))
data = binascii.unhexlify(number)

f2=open('111.txt','wb') #保存到111.txt
f2.write(data)
f2.close()

这个脚本要跑好一会,最后保存至111.txt。

voip流量

这种实际上就是电话的流量

可以在wireshark中点击电话-voip通话来查看

内存取证/磁盘取证

思路:

这种需要虚拟机来挂载文件,可以使用vmware或者FTK,我做的不多。。

或者用vera挂载的。

veracrypt

这个需要一个文件,可以挂载磁盘

而且可能会需要密钥和密钥文件,例子:

2024-12-12 162453

注意:不同密码可以解密出不同的磁盘文件

vol2 || vol3

可以使用vol2或3来分析

查看imageinfo——查看操作版本

1
vol.py -f image.raw imageinfo

lsadump——看用户密码

1
2
3
vol.py -f image.raw --profile=Win7SP1x86_23418 lsadump  
#profile后面跟的是imageinfo得到的操作版本
#lsadump需要安装插件

vol2的一些基本命令

1
2
3
4
5
6
7
8
# 识别操作系统的基本信息
vol.py mem.dump imageinfo
# 查看进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pslist
# 查看隐藏或者解链的进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pstree
# 通过memdump爆破出进程对应的信息,3036是对应进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 memdump -p 3036 --dump-dir=./

注意,mspaint.exe是画图进程,可能会藏东西,如果有的话可以dump下来,改后缀为.data,使用GIMP2打开图片。不断修改x,y的值直到看到藏的东西。(GIMP2可以在microsoft store里下到)

.vmdk文件

后缀为 .vmdk 的文件是 VMware 虚拟磁盘文件,通常用于虚拟机环境中存储虚拟机的磁盘数据。

vmdk可以用7z解压!

可以使用虚拟机打开试试。

有些可以看010,有内容的话,可以尝试解密,有时候直接复制解密不了

可以使用kali自带的7z解密提取这些文件

1
7z x flag.vmdk -o./

解压后就能看到好几个文件夹。

vhd文件

这是磁盘文件,可以直接双击打开,会发现多了两个磁盘,在磁盘里可以找东西

怎么虚拟化来看图形化界面?

使用Hyper-V搭建虚拟机(怎么下Hyper-V?可以看这个

注意挂载vhd的时候要选择第一代来挂载,不然会报错

进入后可以win+r看上一条命令找线索。

理论上也可以更改vhd格式来使用vmware挂载。

如果vhd用了BitLocker加密的话我们可以使用Elcomsoft Forensic Disk Decryptor进行解密

iso映像文件

一般是u盘文件,可以直接改后缀为zip然后解压,或者formost提取出里面的内容

img文件

可以kali挂载

1
2
3
4
5
6
7
8
mount 1.img /mnt
# 挂载到mnt下
cd /mnt
# 切进去就行
extundelete attachment.img --restore-all
# 恢复被删除的目录或文件
sudo umount /mnt
# 先回到上级目录再取消挂载

也可以试试其他工具

安卓取证

安卓取证一般是给vmdk文件或者ovf文件,都可以用vmware挂载,后者可以直接在vm打开文件

DiskGenius

用于恢复磁盘删除的文件,也可以直接全部扫描然后提出来。

pyjail / py沙盒逃逸

思路:

要看他给没给源代码,没有怎么猜测,给了怎么绕过黑名单/长度限制等等

参考链接:

Python沙盒逃逸深度学习 | C3ngH’s B10g

Python Jail 沙盒逃逸 合集_pyjail-CSDN博客

ms-office题

思路:

可以改后缀为zip看看,文本里可能会把文字改成白色的来隐藏可以ctrla+改色看看

遇到的加密过的mc-office可以用passwarekit来爆破

ms-office文件本质是zip

MS-Office文件word、excel、ppt本质都是zip文件,就可以隐写。

可以直接改后缀名为zip

如果后缀是docm的话可能有宏,在宏里看看

1.WPS自带宏查看,在 视图/宏/查看宏 里

2.使用olevba

1
olevba decode.docm

doc里隐藏文字

勾选文件/选项/显示/隐藏文字

然后看看有无隐藏的东西

视频题

思路:

我遇到的一般是在视频的某一帧里藏二维码之类的内容,需要好点的眼力

帧慢放

使用potplayer即可

osint

思路:

exiftool识别图片gps

谷歌识图,谷歌地图等等

识图

谷歌识图:https://images.google.com/?hl=zh-cn

yandx识图:https://yandex.com/images/

exiftool查看gps

地图/定位

试试谷歌地图看街景,但谷歌的街景是很久以前的,所以有可能出不来

谷歌地图:https://www.google.com/maps/?hl=zh-cn

百度地图:https://map.baidu.com/@13322349,3375628,13z

LTE定位基站地址

定位网址: 移动联通电信基站位置查询

3词描述地址

网站:what3words /// The simplest way to talk about location

其他 && 工具

反编译——这应该是reverse领域才对。。

pyc反编译

.pyc 是 Python 编译后的字节码文件,通常是在运行 Python 脚本时由解释器自动生成,用于加速程序运行

想查看 .pyc 文件的源码,可以使用反编译工具 uncompyle6 将其还原为 .py 文件。

-使用 uncompyle6

-在线网站 https://tool.lu/pyc/

pyc也有剑龙隐写,地址: AngelKitty/stegosaurus: A steganography tool for embedding payloads within Python bytecode.

如果有1.pyc,直接(注意这里python的版本要是3.6的,也许是要对应pyc文件的代码的python版本,我们可以使用pyenv切换python版本)

1
python stegosaurus.py -x 1.pyc

exe反编译

使用IDA

apk反编译

使用jadx-gui-1.4.4-no-jre-win.exe

eml文件

拿到一个邮件文件后缀是eml的可以利用QQ邮箱,

选择写信,收信人写自己,把eml文件拖进去,然后发送。

之后自己就能收到这个文件,QQ邮箱可以预览eml文件,如果有附件的话直接下载就好了。

.dmp文件

dmp文件是windows系统中的错误转储文件,当Windows发生错误蓝屏的时候,系统将当前内存【含虚拟内存】中的数据直接写到文件中去,方便定位故障原因。

里面包含主机用户密码信息

.dmp文件binwalk和foremost提不出来,需要我们手动提一下

提出来之后用mimikatz分析文件,下载地址 发行版 2.2.0 20220919 Djoin parser & Citrix SSO Extractor · gentilkiwi/mimikatz · GitHub

这个是已经打包好的exe,直接运行就行

相关命令

1
2
3
4
5
6
//提升权限
privilege::debug
//载入dmp文件
sekurlsa::minidump lsass.dmp
//读取登陆密码
sekurlsa::logonpasswords full

画图

1.gnuplot

得到诸如(7,7)的文本我们需要转化成 7 7 ,如

2024-11-20 212245

转化成 ↓ ↓ ↓

2024-11-20 213106

可以直接使用记事本的替换功能,比脚本好用的多

脚本不推荐):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with open('E:\meihuai.txt', 'r') as res:  # 坐标格式文件比如(7,7)
re = res.read()
res.close()

with open('E:\output.txt', 'w') as gnup: # 将转换后的坐标写入output.txt
re = re.split()
tem = ''
for i in range(0, len(re)):
tem = re[i]
tem = tem.lstrip('(')
tem = tem.rstrip(')')
for j in range(0, len(tem)):
if tem[j] == ',':
tem = tem[:j] + ' ' + tem[j+1:]
gnup.write(tem + '\n')
gnup.close()

然后

1
gnuplot

1
plot 'zuobiao.txt'  

来进行画图,画好后会自己打开

2.RGB数据串转图片

可以用随波逐流

不行就脚本

1
2
3
4
5
6
7
8
9
10
11
12
from PIL  import Image
string=''

file=open('qr.txt')
MAX=200

picture=Image.new("RGB",(MAX,MAX))
for y in range(MAX):
for x in range(MAX):
string =file.readline()
picture.putpixel([x,y],eval(string)) #直接使用eval()可以转为元组
picture.show()

3.Logo画图

这种的代码很有特征,类似于这种:

1
cs pu lt 90 fd 500 rt 90 pd fd 100 rt 90 repeat 18[fd 5 rt 10] lt 135 fd 50 lt 135 pu bk 100 pd setcolor pick [ red orange yellow green blue violet ] repeat 18[fd 5 rt 10] rt 90 fd 60 rt 90 bk 30 rt 90 fd 60 pu lt 90 fd 100 pd rt 90 fd 50 bk 50 setcolor pick [ red orange yellow green blue violet ] lt 90 fd 50 rt 90 fd 50 pu fd 50 pd fd 25 bk 50 fd 25 rt 90 fd 50 pu setcolor pick [ red orange yellow green blue violet ] fd 100 rt 90 fd 30 rt 45 pd fd 50 bk 50 rt 90 fd 50 bk 100 fd 50 rt 45 pu fd 50 lt 90 pd fd 50 bk 50 rt 90 setcolor pick [ red orange yellow green blue violet ] fd 50 pu lt 90 fd 100 pd fd 50 rt 90 fd 25 bk 25 lt 90 bk 25 rt 90 fd 25 setcolor pick [ red orange yellow green blue violet ] pu fd 25 lt 90 bk 30 pd rt 90 fd 25 pu fd 25 lt 90 pd fd 50 bk 25 rt 90 fd 25 lt 90 fd 25 bk 50 pu bk 100 lt 90 setcolor pick [ red orange yellow green blue violet ] fd 100 pd rt 90 arc 360 20 pu rt 90 fd 50 pd arc 360 15 pu fd 15 setcolor pick [ red orange yellow green blue violet ] lt 90 pd bk 50 lt 90 fd 25 pu home bk 100 lt 90 fd 100 pd arc 360 20 pu home

那就是画图没跑了

在线网站: Logo解释器

4.base64转图片

随波逐流

路由器配置查看工具

RouterPassView

-下载 https://routerpassview.en.lo4d.com/windows

使用方法:

用于恢复路由器密码的工具,能够从路由器中提取用户,密码,无线密钥等信息

RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置,然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码,路由器的登录密码,无线网络的关键。如果你失去了这些密码1 /钥匙,但你仍然有你的路由器配置的备份文件,RouterPassView可以帮助你从你的路由器恢复您丢失密码的文件。

010editor .zip模板对照表

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
+ ZIPFILERECORD record # 压缩源文件数据区
- char frSignature[4] # 压缩源文件标志
- ushort frVersion # 压缩源文件版本
- ushort frFlags # 压缩源文件标志 (有无加密,这个更改这里进行伪加密,改为01 00打开就会提示有密码了)
- enum COMPTYPE frCompression
- DOSTIME frFileTime # 压缩源文件时间
- DOSDATE frFileDate # 压缩源文件日期
- uint frCrc # 压缩源文件CRC32校验值
- uint frCompressedSize # 压缩源文件压缩后大小
- uint frUncompressedSize # 压缩源文件压缩前大小
- ushort frFileNameLength # 压缩源文件名长度
- ushort frExtraFieldLength # 压缩源文件扩展域长度
- char frFileName[frFileNameLength] # 压缩源文件名
- uchar frData[frCompressedSize] # 压缩源文件数据
+ ZIPDIRENTRY dirEntry # 压缩源文件目录区
- char deSignature[4] # 目录标志
- ushort deVersionMadeBy # 创建该条目的版本
- ushort deVersionNeeded # 解压该条目所需的版本
- ushort deFlags # 标志位 (判断是不是伪加密的位置,如果是真加密则两个都是0900,伪加密这个则是0000或0100)
- enum COMPTYPE deCompression # 压缩方法
- DOSTIME deFileTime # 最后修改时间
- DOSDATE deFileDate # 最后修改日期
- uint deCrc # CRC32校验值
- uint deCompressedSize # 压缩后的大小
- uint deUncompressedSize # 压缩前的大小
- ushort deFileNameLength # 文件名长度
- ushort deExtraFieldLength # 扩展域长度
- ushort deFileCommentLength # 文件评论长度
- ushort deDiskNumberStart # 起始磁盘编号
- ushort deInternalAttributes # 内部属性
- uint deExternalAttributes # 外部属性
- uint deRelativeOffset # 该条目在 ZIP 文件中的偏移位置
- char deFileName[deFileNameLength] # 文件名
- char deExtraField[deExtraFieldLength] # 扩展域
- char deFileComment[deFileCommentLength] # 文件评论
+ ZIPENDLOCATOR endLocator # 压缩源文件目录结束标志
- char elSignature[4] # 结束标志
- ushort elDiskNumber # 当前磁盘编号
- ushort elStartDiskNumber # 目录开始的磁盘编号
- ushort elEntriesOnDisk # 当前磁盘上的条目数量
- ushort elEntriesTotal # 总条目数量
- uint elSizeOfDirectory # 目录的总大小
- uint elOffsetOfDirectory # 目录开始的偏移位置
- ushort elCommentLength # 注释长度
- char elComment[elCommentLength] # 注释

一些kali的小知识

基本命令

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
ls  #列出所有东西
cd #切换
pwd #列出路径
cat #查看
tac #cat的反向,逆向(行)读取
mkdir #创建目录
mv #移动文件/重命名文件
cp #复制文件/目录
nl #加行号
more #按页读取内容
ps #查看进程信息
less #查看文件内容,与more相似
head #仅打印文件开头内容
tail #仅打印文件结尾内容
ping #远程连接,如主机
jobs #查看后台运行任务
kill #杀死后台运行任务,需要加-pid
which #查找文件所在位置
whereis #查找文件路径
locate #查找文件路径,与whereis相似
find #向下遍历寻找文件

--help #任何命令后加这个即可看到说明
sudo su #提升权限至管理员
rm -rf profire_name #删除文件目录
ifconfig #查看ip地址

切换python版本

kali自带python2.7和python3.x,有时候需要我们切换

1
update-alternatives --config python

然后选序号就行

图形化桌面-远程连接

这个要自己下

1
kex

虚拟环境

Kali Linux 对 Python 包管理进行了限制,防止系统范围内的 Python 安装被破坏。所以有时候报错是需要使用虚拟环境

创建一个新的虚拟环境:

1
python3 -m venv env  #env是虚拟环境名称,可以更改

激活虚拟环境:

1
source env/bin/activate

在虚拟环境中就可以安装一些东西了

退出虚拟环境:

1
deactivate

删除虚拟环境只需要删除对应虚拟环境的目录即可

一些windows的小知识

基本命令

1
2
3
4
ls  #列出所有东西
cd #切换
cat #查看
ipconfig #查看ip地址

alt

按住alt再按小键盘的数字的话可以输出对应的ascii码值,比如我按住alt再按65的话会输出A

删除windows自带防火墙——windows defender

github地址: https://github.com/ionuttbara/windows-defender-remover

Linux提权

详细见我这篇博客 Linux提权浅析 | MetaVi

区块链Blockchain

详见我这篇博客 区块链Blockchain学习 | MetaVi