1、波形图分析:摩斯电码
2、频谱图分析(有时要调高最高频率)
3、Silenteye隐写
wav音频文件可能是 silenteye 隐写,可以拿默认密码 silenteye 解密试试看
4、Deepsound隐写
先用 deepsound 打开试一下,如果需要密码说明就是 deepsound 隐写,有密钥直接填入密钥解密即可
如果是 deepsound 隐写并且没有密钥,就先用
<font style="color:rgb(36,41,47);">deepsound2john</font>脚本获取wav文件的哈希值(注释里有使用方法),
然后拉入kali用john爆破hash(如果编码有误,可以先用notepad另存为一下)
执行:john 1.txt
5、SSTV慢扫描电视
# 安装步骤:
sudo python3 setup.py install
# 注意python版本如果低于python3.9,需要将setup.py中的numpy那一行注释
# 使用命令如下,图片会自动命名为result.png
sstv -d flag.wav
Windows中使用RX-SSTV
使用前还要安装虚拟声卡 Virtual Audio Cable
#使用步骤:
1.点击Setup-Sound Control and Devices将默认输入设备和输出设备都设置为虚拟声卡line1
2.用VLC播放音频(最好不要用Au播放)
3.如果扫描出来的图片有错位,可以点击slant手动修改
4.退出RX-SSTV前要注意把默认的输入/输出设备改回原来的参数
拉入kali用qsstv(有时候要用到反向和反相)
6、电话音分析(DTMF)
用在线网站:
http://www.dialabc.com/sound/detect/
或者在dtmf2num.exe里使用
dtmf2num -o C:Desktop1.wav命令
7、wav可能是业余无线电文件
先用sox把wav转为raw:
sox -t wav latlong.wav -esigned-integer -b16 -r 22050 -t raw latlong.raw
再用multimon-ng分析:
multimon-ng -t raw -a AFSK1200 latlong.raw
8、steghide
#如果密码已经知道了
steghide extract -sf filename -p passwd
在WSL或者kali里用Stegseek跑(字典在wordlist里)
#如果密码未知
可以用下面这个脚本爆破
#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
#或者在WSL或者kali里用Stegseek跑(字典在wordlist里)
stegseek filename rockyou.txt
9、MP3音频(mp3stego隐写)
使用前需要先把要处理的文件放到 mp3stego 目录下
# Encode
encode -E data.txt -P pass sound.wav sound.mp3
data.txt里面放要隐写的txt信息 pass是解密时需要的密码
# Decode
decode -X -P pass sound.mp3
-X 是提取出隐写的文件
pass是解密时需要的密码
sound.mp3是待处理的MP3文件
# mp3stego可以使用无密码进行隐写
# 如果需要密码解密,但是没有密码,可以试试看音频中歌曲的名字(比如Canon)
10、WAV还可能是OpenPuff隐写(有密码)
直接用OpenPuff.exe解密即可
11、stegpy隐写
stegpy 开源地址下载好后直接用WSL输入以下命令并输入密码解密即可
也可以直接用 pip 安装:
pip3 install stegpy
stegpy 1.wav -p
12、DeEgger Embedder隐写
可以直接使用 DeEgger Embedder 工具 extract files
13、分析左右声道的差值
# 导入模块wavfile
import scipy.io.wavfile as wavfile
# 读取音频文件的采样率和数据
sample_rate, data = wavfile.read("1.wav")
# print(sample_rate, data)
# 创建两个列表来存储左右两声道的数据
left = []
right = []
for item in data:
# print(item)
# 第一列的数据是左声道,第二列是右声道
left.append(item[0])
right.append(item[1])
diff = [str(left-right) for left, right in zip(left, right)]
res = ''
for item in diff:
if item == '2':
res += '1'
elif item == '1':
res += '0'
else:
continue
with open('res.txt', 'w') as f:
f.write(res)
14、使用脚本提取数据进行分析
# 2023 DASCTFxCBCTF
import numpy as np
import wave
import scipy.fftpack as fftpack
SAMPLE_RATE = 44100 # 表示采样率,即每秒钟有多少采样点
SAMPLE_TIME = 0.1 # 表示一个样本的时间,即0.1秒
SAMPLE_NUM = int(SAMPLE_RATE * SAMPLE_TIME) # 计算在SAMPLE_TIME时间内的采样点数
LIST = [800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700]
def get_len():
with wave.open('1.wav','rb') as f:
# 使用numpy从音频文件中读取所有的帧并将其转换为int16数据类型的数组
wav_data = np.frombuffer(f.readframes(-1),dtype=np.int16)
N = len(wav_data)
print(N)
#这实际上计算了wav文件的总时长(以0.1秒为单位)
a = (N/(44100*0.1)) / 189
print(a)
# 傅立叶变换函数。给定时域数据,该函数返回其频域形式的前半部分
def fft(data):
N = len(data) #获取数据长度
fft_data = fftpack.fft(data) #得到频域信号
abs_fft = np.abs(fft_data) #计算幅值
abs_fft = abs_fft/(N/2)
half_fft = abs_fft[range(N//2)] #取频域信号的前半部分
return half_fft
# 此函数旨在解码100ms的音频数据。它首先对音频数据进行FFT变换,然后检查LIST中的每个频率,以确定哪些频率具有明显的活动(幅值大于0.8)
def dec_100ms(wave_data_100_ms):
fft_ret = fft(wave_data_100_ms)
for index, freq in enumerate(LIST):
if np.max(fft_ret[int(freq*SAMPLE_TIME) - 2 : int(freq*SAMPLE_TIME) + 2]) > 0.8:
print(freq, 'Hz有值',end=" ")
return index
# 解码整个音频文件中的句子。它首先确定音频中有多少个100ms的段,然后每次解码两个段来生成一个两位数的索引,该索引用于查找与之对应的字符
def dec_sentence(wav_data):
_100ms_count = len(wav_data) // SAMPLE_NUM
# print(_100ms_count)
print('待解码音频包含', _100ms_count // 2, '个字')
ret = ''
for i in range(0, _100ms_count, 2):
index = 0
for k in range(2):
index = index*10 + dec_100ms(wav_data[i*SAMPLE_NUM + k*SAMPLE_NUM : i*SAMPLE_NUM + (k+1)*SAMPLE_NUM])
print('序号:', index)
ret += string[index]
return ret
if __name__ == '__main__':
# get_len()
# 题目给了一个字符串序列,所以就是从音频中提取出index,然后根据index找到对应的字符
string ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_}{-?!"
with wave.open('1.wav', 'rb') as f: #读取为数组
wav_data = np.frombuffer(f.readframes(-1), dtype=np.int16)
print(dec_sentence(wav_data))
# DASCTF{Wh1stling_t0_Convey_informat1on!!!}
15、提取两个音频中的浮点集并分析
import librosa
import libnum
res = []
flag = ""
table = {'19':"01","9":"00","39":"11","29":"10"}
# 使用文件原始采样率获取音频数据和采样率
data1,sr1 = librosa.load("secret.wav",sr=None,dtype="float32")
data2,sr2 = librosa.load("1.wav",sr=None,dtype="float32")
for i in range(148):
res.append(str(int((data1[i]-data2[i])*1e7)))
for item in res:
flag += table[item]
print(libnum.b2s(flag))
# b'SYC{wav_LSB_but_You_can_get_M3_Coll!}'
注:鼎星安全有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
原文始发于微信公众号(鼎新安全):Misc中音频题的常见思路
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论