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

0x01 赛题说明

图片 1.png

0x02 曲折

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

  • 直接右击txt打开,查找关键词 flag
  • 查看该音频文件的波形图、频谱图,是否存在相关信息可以转化为摩斯电码
  • 查看mp3 中是否含有隐藏文件,提取文件

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

图片 2.png

第二个思路:

波形图:

图片 3.png

频谱图

图片 4.png

都没有任何有用的信息

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

图片 5.png

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

图片 6.png

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

图片 7.png

图片 8.png

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

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

Binwalk 发现:

图片 9.png

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

图片 10.png

发现有 PS 的痕迹,难道?

提取出图片:

图片 11.png

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

0x03 题解

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

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

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

图片 12.png

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

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

图片 13.png

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组

图片 14.png

大小都为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:

图片 15.png

感谢Batsu师傅的帮助

标签: CTF, 工控安全, 工控, 隐写

添加新评论