[Fin] osc
拿到附件后打开是个wav文件,文件头文件尾经检查均正常,没有附加额外信息。
拖到Audacity里查看频谱图,可以隐约的“CTF”三个字母,推测这个就是flag。
题目是osc(示波器),解题关键应该和波形有关,放大查看构成字符“F”的波形。
可以观察到波谷呈从“|”到“:”的变化(只看每个周期的前半段最低处),正好对应字符“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')