音频频谱与DTMF
音频频谱与DTMF
本文适合
拿到 WAV/MP3/FLAC/视频音轨后,需要判断频谱、DTMF、摩斯、声道差异或音频隐写的 Misc 学习者。学完你能:用波形、声谱图、频率峰值和声道对照验证隐藏方式,并把解出的数字/文本继续转换成 flag
音频题不只靠听。很多信息藏在频域、声谱图、双音多频按键、左右声道差异或采样数据中。
一句话判断
音频题先不要只靠耳朵听;如果波形、频谱、声道、节奏、倒放或元数据异常,就把声音转成可观察的图、频率表和样本数据来验证。
题目中常见信号
说明:信息藏在频域图案
第一动作:生成 spectrogram 并调整频率范围
说明:可能是 DTMF、摩斯或频率编码
第一动作:分段并测频率/时长
说明:可能差分藏信息
第一动作:拆声道或相减
说明:音频被反转
第一动作:ffmpeg -af areverse
说明:变速/变调隐藏
第一动作:尝试 0.5x/2x 或重采样
说明:音频只是容器
第一动作:exiftool、binwalk、strings
核心概念
音频可以同时从三个层面分析:
- 时域:波形、静音间隔、摩斯长短音、节奏编码。
- 频域:FFT、声谱图、DTMF 双频、固定频率映射。
- 文件层:元数据、封面图、尾部附加、嵌入压缩包。
DTMF 的证据不是“听起来像按键”,而是每个片段同时出现一个低频和一个高频;摩斯的证据不是“有哔声”,而是点划时长和间隔符合规则。
最小分析流程
- 用
file/ffprobe/soxi确认格式、采样率、声道数、时长。 - 用
exiftool、strings、binwalk排除元数据和尾部附加。 - 生成声谱图,看是否有文字、二维码、频率轨迹或异常高频。
- 拆分左右声道,分别试听、看频谱、做差分。
- 对规律短音测频率和时长,判断 DTMF、摩斯或自定义频率表。
- 尝试倒放、变速、重采样、滤波后再观察。
- 解出的数字/字母继续按编码、坐标、电话键盘或压缩包密码解释。
最小验证示例
file sound.wav
ffprobe -hide_banner sound.wav
exiftool sound.wav
binwalk sound.wav
# 生成声谱图
ffmpeg -i sound.wav -lavfi showspectrumpic=s=1600x900:legend=1 spectrogram.png
# 倒放
ffmpeg -i sound.wav -af areverse reversed.wav
# 拆分左右声道
ffmpeg -i sound.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wavDTMF 最小验证:
multimon-ng -a DTMF sound.wav判断依据:
声谱图出现可读图案 -> 频域隐藏成立
DTMF 解码输出稳定数字 -> 再按电话键盘/ASCII/题目提示转换
左右声道相减后出现图案或语音 -> 声道差分成立常见利用 / 解题路线
路线总览:
关键证据:频谱图中有文字/二维码
常用动作:生成高清 spectrogram,必要时调色/裁剪
关键证据:每段两个固定频率
常用动作:multimon-ng 或 FFT 分段测频
关键证据:点划时长和静音间隔规律
常用动作:二值化波形,按时长映射
关键证据:左右声道相似但不完全一致
常用动作:拆声道、相减、反相抵消
关键证据:正放难读或频率异常
常用动作:reverse、tempo、rate 变换
关键证据:样本低位或尾部异常
常用动作:提取样本 bit,binwalk 后转文件分析
常见失败原因
常见原因:信息在频谱或文件层
排查动作:生成声谱图并查元数据/尾部
常见原因:噪声、片段太短或非标准频率
排查动作:分段 FFT,允许自定义频率表
常见原因:阈值或速度估计错
排查动作:用持续时间聚类,不手动凭感觉
常见原因:FFT 窗口或频率范围不合适
排查动作:调整窗口、分辨率和显示范围
常见原因:需要相减或反相,不只是分离
排查动作:用 sox -m 或音频编辑器做差分
常见原因:结果是中间编码
排查动作:尝试 ASCII、电话键盘、坐标、密码
迷你案例
题目给 beep.wav,听起来是规律按键音。验证:
ffmpeg -i beep.wav -lavfi showspectrumpic=s=1200x700 spectrogram.png
multimon-ng -a DTMF beep.wav输出:
DTMF: 102108097103按三位 ASCII 分组:
s = "102108097103"
print("".join(chr(int(s[i:i+3])) for i in range(0, len(s), 3)))得到 flag。WP 要说明:声谱图中每段都有双频峰值,multimon-ng 只是验证工具,不是猜出来的。