美文网首页
[misc]上帝之音 400

[misc]上帝之音 400

作者: BlinKer | 来源:发表于2017-09-17 21:17 被阅读0次

0x00 已知条件

给了一个godwave.wav,还有两个提示。

0x01 解法过程

  • Hint1: 你们做音频题都不喜欢看时域图?
    根据这个,用Cooledit看一下时域波形,如下:
image.png
发现波形明显整过,赋值差异很明显,数出周期为64个点。第一次做音频题,看一下writeup,写个脚本把它提取成01序列:
写的过程中值得注意的是:横轴改成smpl,即采样点,每个单位对应一个实心点;纵轴改成norm,表示幅值。这样在编程时,每个点就是横轴对应waveData[i],纵轴对应norm。
另外,判断每周期的值时,本来采用的是计算平均值。后来简化计算改成全部求和,先看了一下低赋值周期最大值不超过0.035,那么64个点最多也就2.24。(不知道题解的这个10是怎么取的,可能是为保险取大点吧)
[Python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wave
import matplotlib.pyplot as plt
import numpy
import os

path = 'D:\PyCharm\Projects\CTF\Javis OJ\misc\god_wave\\'
wav = wave.open(path+'godwave.wav','rb')

params = wav.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]

strData = wav.readframes(nframes) #读取音频,字符串格式
waveData = numpy.fromstring(strData, dtype=numpy.int16) #上述字符串转int
waveData = waveData*1.0/(max(abs(waveData))) #wave幅值归一化,与Cool edit的norm纵轴数值一致

#将音频转化为01串
string = ''
norm = 0
for i in range(1735680):
    norm = norm+abs(waveData[i])
    if (i+1) % 64 == 0:
        if norm > 10:
            string += '1'
        else:
            string += '0'
        norm = 0

with open('01output.txt','w') as output:
    output.writelines(string)

在输出文件中写了一行01串。

  • Hint2: 在数据传输过程中,我们往往会使用一种自带时钟的编码以减少误码率
    搜索“自带时钟的编码”,说是曼彻斯特编码。写脚本把上面得到的01串做曼彻斯特解码,负电平为1,正电平 为0:
# -*- coding: utf-8 -*-
file_in = open('01output.txt','r')
code = file_in.readline()
file_in.close()
le = len(str(code))
print le
print code

result = ''
count = 0
res = 0
while code != '':
    cp = code[:2]
    if cp != '':
        if cp[0] == '0' and cp[1] == '1':
            res = (res<<1)|0
            count +=1
        if cp[0] == '1' and cp[1] == '0':
            res = (res<<1)|1
            count +=1
        if count == 8:
            result += chr(res)
            count = 0
            res = 0
    else:
        print 'Unexpected cp, exit!' # found '00' or '11', stop the script directly
        break

    code = code[2:]

with open('result.png','wb') as file_out:
    file_out.write(result)

一开始自己写的时候犯蠢,直接每两位出一位写到result里,写出来也打不开。
参(zhao)考(chao)题解用位运算, 逐字节(8位)转成字符写入。打开是个二维码,扫了即可。
也不知道题解怎么知道要存成PNG的……好吧自己试了一下只要是图片格式都能扫,随便选个格式就行。

相关文章

  • [misc]上帝之音 400

    0x00 已知条件 给了一个godwave.wav,还有两个提示。 0x01 解法过程 Hint1: 你们做音频题...

  • 求情链接参数Base64加解密

    importsun.misc.BASE64Decoder; importsun.misc.BASE64Encode...

  • [XMAN-2017-资格赛]

    (MISC) Prety Cat (MISC) Green_Code 下载流量包 , WireShark打开很明显...

  • jmeter - base64编码实现

    import sun.misc.BASE64Decoder;import sun.misc.BASE64Encod...

  • 独立宣言与上帝之音

    在<独立宣言>的第一部分,提出了"人类舆论"的概念,也就是说我们常说的"国际社会".并规定说,当一个民族必须解除同...

  • 拉脱维亚 | 与上帝之音的邂逅

    结束了爱沙尼亚之旅的我们,终于踏上了北方小巴黎-里加(拉脱维亚首都)。波罗地海国家被誉为会唱歌的民族,这3个国家的...

  • 5.生成设备节点 (iTOP4412)

    #include 头文件 misc_register(&hello_dev);设备节点注册函数 misc_dere...

  • MISC

    比较两棵二叉树是否相同Same TreePython版本: C++ 版本: Find All Numbers Di...

  • misc

    这是一张单纯的图片 key{you ...

  • MISC

    诏问山中所有赋诗以答 南北朝·陶弘景山中何所有,岭上多白云。只可自怡悦,不堪持赠君。 南园 李贺男儿何不带吴钩,收...

网友评论

      本文标题:[misc]上帝之音 400

      本文链接:https://www.haomeiwen.com/subject/vkmesxtx.html