[Fin] osc

拿到附件后打开是个wav文件,文件头文件尾经检查均正常,没有附加额外信息。

拖到Audacity里查看频谱图,可以隐约的“CTF”三个字母,推测这个就是flag。 pAmbSI0.png

题目是osc(示波器),解题关键应该和波形有关,放大查看构成字符“F”的波形。 pAmHXrj.png

可以观察到波谷呈从“|”到“:”的变化(只看每个周期的前半段最低处),正好对应字符“F”从左向右用一个竖线扫描时,扫出的图案。推测字符是由每个波的前半个周期,波谷处形成的。

对左边八个已知字符(“BaseCTF{“)分析,结果与猜想均吻合。

直接上代码,经过适当的参数选取,可以将flag打印地好看一点:

import scipy.io.wavfile as wav
from PIL import Image, ImageDraw

rt, wavsignal = wav.read('flag.wav')
#print(len(wavsignal))#151791
offset = 10    #    y轴偏移矫正
length = 151791 // 20 // 50 - 51   #   粗略估算每个波的波长

image = Image.new("RGBA", (1500, 200), (0, 0, 0))

for i in range(offset, 151791, length):
    if (i + length - 1) // length >= 1500: break
    mx = 0
    padding = int((i // length) / 4.4)      #图像矫正
    subwav = wavsignal[i + padding : i + length + padding]
    for x, y in subwav:     #找到区间最大值(其实是可以公式推算的,斜线斜率可测,但我懒得算,能跑出图就算胜利)
        mx = max(mx, y)
    for j in range(len(subwav)):
        y = mx - subwav[j][1]
        c = min(255, int(255 * (max(0, y) / (2 * mx + 1))))     #用该点y值距区间最大值的距离计算亮度
        L = len(subwav)
        image.putpixel(((i + L - 1) // L, j * 200 // L), (0, c, 0))

image.show()
# image.save('flag!!!.png')

打印图片如下,还算清晰: pAmHjqs.png