Dalock

本来无一物,何处惹尘埃

0%

mp3的private_key隐写

De1CTF mc_easybgm

这源自De1CTF的一道题,简单谈一下解题思路

首先从网上扒下来了bgm.mp3
简单分析一下可知,是一首轻音乐上面盖了一层Deja vu
拿到一个mp3文件,第一个想到的肯定是mp3stego,但是缺一个密码

分析了一下扒下来的bg.jpg文件,并没有什么东西
然后师傅们又抓到了一个png文件,是服务器的头像
用zsteg分析发现有PGP Seret Key -

由于不熟PGP,还以为这个东西肯定有用,就提出来了,但其实没啥用,zsteg的分析是错的,PGP文件格式长这样

后来尝试听歌识曲找到了轻音乐的名字moogcity2,以这个字符串作为密码,mp3stego出了一个txt文件,但是不可读,是一堆乱码,用CyberChef进行了xor爆破和编码爆破,各种分析后无果

private_key隐写

其实分析的东西错了,应该分析bgm.mp3的,被easy stego的提示误导了
首先看一下mp3的官方文档

https://www.mp3-tech.org/programmer/frame_header.html?tdsourcetag=s_pctim_aiomsg

在MPEG音频文件中,没有主header,因为MPEG音频文件是由一系列称为帧的较小部分组成的。每个帧都是一个具有自己的标头和音频信息的数据块。

各帧帧头中都有1bit的private_key,可以用来放信息,对mp3文件本身
没什么影响,我们写脚本将其导出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a = open("bgm.mp3",'rb')
b = a.read().encode("hex")

sum = ""
cnt = 10403 #第一个帧开始的位置
cnt1 = 417 #一帧的大小
cnt2 = 128 #最后一帧之后内容的大小
for i in range(2*cnt+1,len(b)-cnt2*2,cnt1*2): #读取每帧的private_key值
sum += b[i+4]

print len(sum)
sum1 = ""

for i in range(0,len(sum),8): #有效private_key位数
if sum[i:i+8] == "00000000":
break
sum1 += sum[i:i+8]

print sum1
sum1 = sum1[::-1]
sum2 = ""
for i in range(0,len(sum1),8): #转为字符输出
sum2 += chr(int(sum1[i:i+8],2))
print sum2

运行之后就可以得到flag
由于对音频相关模块不熟,这里只是一个简单的脚本,利用010editor的mp3模块可以直接分析得到cnt,cnt1,cnt2的值,也就很方便求解
之后视情况更新知识点和新脚本

欢迎关注我的其它发布渠道