某工控 CTF 线上赛隐信道数据安全分析题解

0x01 赛题说明

文件下载:

question_1564258711_5-flag-woody.mp3.zip (7.7 MB)

0x02 曲折

题目很明显,就是一道 MP3的隐写题,按照常规思路,有三种思路:

  • 直接右击txt打开,查找关键词 flag

  • 查看该音频文件的波形图、频谱图,是否存在相关信息可以转化为摩斯电码

  • 查看mp3 中是否含有隐藏文件,提取文件

第一种思路没报多大打算,果然没有:

第二个思路:

波形图:

频谱图

都没有任何有用的信息

第三种思路:使用MP3Steno提取 mp3 中可能存在的 TXT 文件,如下:

猜解出密码为icsc,提取成功:

%E5%9B%BE%E7%89%87%206

就在我以为会有啥好结果出现的时候,打开文件:

这啥玩意?文件开头字节为 Yy,不是什么常见的文件格式,内容也基本上没有完整的有意义的字符串,一度陷入沉默……

想了半天没有结果,于是换思路。

Binwalk 发现:

存在一个 JPEG 文件,想了下,应该是专辑的封面,不确定是否有用,于是 strings:

发现有 PS 的痕迹,难道?

提取出图片:

尝试各种图片隐写的方法,均无果……遂放弃

0x03 题解

赛后我问了一些师傅,最终知道了这题的解决方法。

首先回到题目里去,题目提示,通过某种 private 的方式传递信息

而当你用 010editor 打开该 Mp3 文件,并按照提示安装插件后,发现:


存在一个private bit

因此,只需要提取每一个 mf组中的该字节,组合起来,就是答案。

可以从图中看到 ms 开始位为1 C1B8H,即第 115128 字节

uint32 frame_sync : 12

uint32 mpeg_id : 1

uint32 layer_id : 2

uint32 protection_bit : 1

uint32 bitrate_index : 4

uint32 frequency_index : 2

uint32 padding_bit : 1

uint32 private_bit : 1

uint32 channel_mode : 2

uint32 mode_extension : 2

uint32 copyright : 1

uint32 original : 1

uint32 emphasis : 2
12+1+2+1+4+2+1+1+2+2+1+1+2=32

即 总共 4 字节,private_bit 为24,所在的字节为第 3 个字节

因此要从前一个,即第二个字节开始提取内容,该字节对应的地址为 115130

观察每一个 mf组

大小都为414h,即1044字节

因此可以得到以下脚本:

# coding:utf-8
import re
import binascii

n = 115130
result = ''
fina = ''
file = open('flag-woody.mp3','rb')
while n < 2222222 :
    file.seek(n,0)
    n += 1044
    file_read_result = file.read(1)
    read_content = bin(ord(file_read_result))[-1]
    result = result + read_content
textArr = re.findall('.{'+str(8)+'}', result)
textArr.append(result[(len(textArr)*8):])
for i in textArr:
    fina = fina + hex(int(i,2))[2:].strip('\n')
fina = fina.decode('hex')
print fina

最终得到 flag:

感谢Batsu师傅的帮助

1 个赞