杂项-音频

概念 #

关于音频中的采样率/比特率等概念,可以参看:

双音多频信号DTMF(Dual Tone Multi Frequency),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码,对应着我们小时候打电话按下不同按键的声音

DTMF由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信号有如下16个编码

在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续(早期方法,很老很古董)

http://dialabc.com/
https://baike.baidu.com/item/DTMF/3106215

隐写 #

反向 #

音频可能被反向了,在Audacity中,选择"特效"、“反向"菜单项

频谱/波形隐写 #

使用Audacity软件打开,左上角切换显示,切换到频谱图

类似,左上角切换显示,也可以切换到波形图

频谱/波形可能结合摩尔斯电码或二进制表示出题

如下,频谱结合摩尔斯电码,.-.. .- --. 如下,波形二进制表示,以高为 1 低为 0,1100110110

MP3Stego隐写 #

MP3Stego hides information in MP3 files during the compression process. The data is first compressed, encrypted and then hidden in the MP3 bit stream. 具体细节未研究

官网地址:https://www.petitcolas.net/steganography/mp3stego/
Github地址:https://github.com/fabienpe/MP3Stego
各版本下载地址:https://www.petitcolas.net/fabien/software/

如使用GUI版本,需要把mp3文件放入工具目录下,输入密码(可以为空)即可提取隐藏的txt文件

MP3 private bit隐写 #

MP3格式的帧数据中,有一个uint32 private_bit,可以作为私有数据的标记位,可以使用该标记为隐藏数据

可以先判断前8个mf的private_bit是否为01100110

以下为提取mp3中每帧的private_bit代码,由于mp3每个帧长度可能不同,会有会变化,需结合题目实际进行修改

import re

# 起始位置(是padding的起始位置)
n = 235986
result = ''
files = open('1666e57f47234c5b84bf0a21a23d8227.mp3', 'rb')
# 提取
while n < 2706539:  # 结束位置
    files.seek(n, 0)
    head = files.read(1)   #读取一个字节(8位)

    # padding_bit位于第三个字符的倒数第二位, private_bit位于第三个字符的倒数第一位
    padding = '{:08b}'.format(ord(head))[-2]
    result += '{:08b}'.format(ord(head))[-1]

    # files.seek(n + 1, 0)
    # file_read_result = files.read(1)
    # copyright位于第四个字符的倒数第四位
    # result += '{:08b}'.format(ord(file_read_result))[-4]

    # 观察本文件得知如果padding位为1,帧长度就是418,padding位为0,帧长度就是417
    n += 418 if padding == "1" else 417

# 拼接
flag = ''
textArr = re.findall('.{' + str(8) + '}', result)
for i in textArr:
    flag = flag + chr(int(i, 2)).strip('\n')
print(flag)

同时也可能存在使用copyright位进行隐写,需观察是否相邻几帧的数据有0有1,并进行调整

https://blog.tms.im/2021/03/30/ctf-mp3-copyright-bit.html

LSB隐写 #

silenteye 软件的作用可以将信息(原始或压缩或加密的文本、文件)通过LSB的方式隐藏于图像和音频中 导入音频文件,点击Decode即可还原出被隐藏的文本或文件