GHCTF2025

yolo 发布于 19 天前 24 次阅读


mywav

这道题目没有解决出来,还是受到工具的限制了,那个audacity对于频谱图的处理不够好,根本找不到明显的二进制信息,服了,这是我用adobo audition打开处理得到的结果,很显然高频和低频交叉,我寻思着以我的水平应该是能判断出这是01二进制的

image-20250310124433512

能观察出来,高频在600~900hz,低频在200~400hz

那就搓个脚本,处理下这个音频文件吧,其中高频是1,低频是0

import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt
​
def extract_binary_from_wav(file_path, low_freq_range, high_freq_range, output_path):
    sample_rate, data = wavfile.read(file_path)
    
    if len(data.shape) > 1:
        data = data[:, 0]  
    
    window_size = int(sample_rate * 0.01)   
    binary_data = []
​
    for i in range(0, len(data), window_size):
        window = data[i:i + window_size]
        if len(window) < window_size:
            break
​
        fft_result = np.fft.fft(window)
        freqs = np.fft.fftfreq(len(window), d=1/sample_rate)
        
        magnitude = np.abs(fft_result)
        
      
        valid_indices = np.where((freqs >= low_freq_range[0]) & (freqs <= high_freq_range[1]))[0]
        valid_freqs = freqs[valid_indices]
        valid_magnitude = magnitude[valid_indices]
        
        if len(valid_freqs) == 0:
            binary_data.append(0) 
            continue
        
        max_index = np.argmax(valid_magnitude)
        dominant_freq = valid_freqs[max_index]
        
       
        if high_freq_range[0] <= dominant_freq <= high_freq_range[1]:
            binary_value = 1
        elif low_freq_range[0] <= dominant_freq <= low_freq_range[1]:
            binary_value = 0
        else:
            binary_value = 0  
        
        binary_data.append(binary_value)
​
 
    binary_string = "".join(map(str, binary_data))
    grouped_binary = " ".join([binary_string[i:i+8] for i in range(0, len(binary_string), 8)])
    
    with open(output_path, "w") as f:
        f.write(grouped_binary)
    print(f"提取的二进制数据已保存到 {output_path}")
​
 
    plt.figure(figsize=(10, 6))
    plt.plot(freqs[:len(freqs)//2], magnitude[:len(magnitude)//2])
    plt.axvline(low_freq_range[0], color='r', linestyle='--', label='Low Frequency Range')
    plt.axvline(low_freq_range[1], color='r', linestyle='--')
    plt.axvline(high_freq_range[0], color='g', linestyle='--', label='High Frequency Range')
    plt.axvline(high_freq_range[1], color='g', linestyle='--')
    plt.title('Frequency Spectrum')
    plt.xlabel('Frequency (Hz)')
    plt.ylabel('Magnitude')
    plt.legend()
    plt.grid()
    plt.show()
​
​
file_path = "attachment.wav"
output_path = "output.txt"
low_freq_range = (200, 400)  
high_freq_range = (600, 900)  
​
​
extract_binary_from_wav(file_path, low_freq_range, high_freq_range, output_path)

将得到的结果从二进制转换成ASCII后,得到很长一串字符,想单词,又不太对,这里就能考虑到维吉尼亚密码了,毕竟像某种偏移,但是这里要找到key才行,后来研究了下,维吉尼亚密码有专门的网址进行爆破

https://www.guballa.de/vigenere-solver

爆破结束后,得到了密码

image-20250310130025272

SolveI7ToG3tFl4g

接下来就考到对文件加密的知识储备了,对文件进行带key加密的话,大概率是用oursecret

就这样成功了

image-20250310130235558

得到了flag

NSSCTF{9c99897d-5ea3-481c-b0a5-029fec9eaf42}

其他题目的话,也算是全部解决了,这里把我们小队的wp放上面来

小队wp汇总

恭喜X2ct34m小队第一次打团队赛,就把朝花夕拾干下去了

🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉

本次排名是榜上第二