tôi làm như writeup nhưng flag trong write up khôn...

बनाया गया: 17 मई 2026

का उपयोग करके उत्तर दिया गया GPT-5.5 Thinking द्वारा Chat01

प्रश्न

nesting.mp4
writeup2.txt
image.png

tôi làm như writeup nhưng flag trong write up không đúng
flag format: tjctf{....}
hãy giải lại thật cẩn thận và tìm ra flag có thể nhìn thấy 1 cách rõ ràng rồi viết write up chi tiết

विचार

bash -lc python3 - <<'PY' from pathlib import Path import numpy as np from scipy.io import wavfile from scipy import signal from PIL import Image AUDIO=Path('/mnt/data/nesting_work/audio') OUT=Path('/mnt/data/nesting_solution'); OUT.mkdir(exist_ok=True) selected=[(0,43),(1,36),(2,34),(3,7),(4,23),(5,42),(6,27),(7,29),(8,10),(9,30),(10,47),(11,50),(12,26),(13,17),(14,14),(15,46),(16,28),(17,48),(18,15),(19,2),(20,25),(21,40),(22,18),(22,33)] sr0=16000; y=np.zeros(23sr0,dtype=np.float64); fade_len=int(0.02sr0) for sec,idx in selected: sr,x=wavfile.read(AUDIO/f's{idx}.wav'); assert sr==sr0 seg=x[secsr:(sec+1)sr].astype(np.float64); seg-=seg.mean() env=np.ones_like(seg); ramp=np.linspace(0,1,fade_len); env[:fade_len]=ramp; env[-fade_len:]=ramp[::-1] y[secsr:(sec+1)sr]+=segenv y/=np.max(np.abs(y))+1e-12 wavfile.write(OUT/'selected_overlay.wav',sr0,y.astype(np.float32)) f,t,S=signal.spectrogram(y,fs=sr0,window='hann',nperseg=2048,noverlap=2032,nfft=2048,mode='magnitude',scaling='spectrum') S=S[f<=300,:] L=np.log1p(S.T500); L-=np.percentile(L,20,axis=0,keepdims=True) lo,hi=np.percentile(L,[50,99.5]); img=np.clip((L-lo)/(hi-lo+1e-9),0,1); img=(img.T[::-1,:]*255).astype(np.uint8) Image.fromarray(img).resize((4200,560),Image.Resampling.NEAREST).save(OUT/'clear_spectrogram.png') print('done') PY ls -lh /mnt/data/nesting_solution

Thought for 22m 55s

उत्तर

Flag đúng để submit:

text
tjctf{sine_waves_are_the_best}

Phần sai trong writeup cũ là đưa dấu ! vào flag. Spectrogram hiện câu:

text
SINE WAVES ARE THE BEST!

Nhưng khi chuyển sang flag format thì lấy nội dung câu, lowercase, đổi khoảng trắng thành _, và bỏ dấu câu cuối. Writeup cũ đang submit tjctf{sine_waves_are_the_best!} nên bị sai. (writeup2.txt)

Mình đã tạo lại file kiểm chứng ở đây:

clear_spectrogram.png
[solve_nesting.py]
selected_overlay.wav

Write-up

1. Nhận diện container

File tên là .mp4, nhưng thực tế là Matroska:

bash
file nesting.mp4 ffprobe -hide_banner -show_streams -show_chapters nesting.mp4

Các điểm quan trọng:

text
nesting.mp4: Matroska data Stream #0:0 Video: h264 Stream #0:1 Audio: aac Stream #0:2 -> #0:51 Audio: pcm_f32le, 16000 Hz, mono Stream #0:52 Subtitle: ass 12 chapters

2. Subtitle + chapter là mồi nhử

Extract subtitle:

bash
mkdir -p work ffmpeg -v error -y -i nesting.mp4 -map 0:s:0 work/sub.ass ffprobe -v error -show_chapters nesting.mp4

Lấy subtitle đúng tại timestamp của từng chapter sẽ ghép được:

text
IAMNOTTHEFLAG.NOTYET!

Nó nói rõ đây chưa phải flag.

3. Phân tích 50 audio stream PCM

Extract các stream PCM:

bash
mkdir -p work/audio for i in $(seq 2 51); do ffmpeg -v error -y -i nesting.mp4 -map 0:$i -c:a pcm_f32le work/audio/s$i.wav done

Tính RMS theo từng cửa sổ 1 giây. Các đoạn nổi bật là:

text
sec 00 -> stream 43 sec 01 -> stream 36 sec 02 -> stream 34 sec 03 -> stream 7 sec 04 -> stream 23 sec 05 -> stream 42 sec 06 -> stream 27 sec 07 -> stream 29 sec 08 -> stream 10 sec 09 -> stream 30 sec 10 -> stream 47 sec 11 -> stream 50 sec 12 -> stream 26 sec 13 -> stream 17 sec 14 -> stream 14 sec 15 -> stream 46 sec 16 -> stream 28 sec 17 -> stream 48 sec 18 -> stream 15 sec 19 -> stream 2 sec 20 -> stream 25 sec 21 -> stream 40 sec 22 -> stream 18 and 33

Điểm cần cẩn thận: nhiều đoạn mạnh vì có DC offset. Trước khi ghép để xem spectrogram phải trừ mean của từng đoạn 1 giây:

python
seg -= seg.mean()

Nếu không trừ mean thì spectrogram sẽ bị các vạch dọc mạnh che mất thông tin.

4. Ghép các đoạn được chọn và xem spectrogram

Sau khi overlay các đoạn đã trừ mean, tạo spectrogram low-frequency. Dòng hiện ra là:

text
SINE WAVES ARE THE BEST!

Do đó flag chuẩn hóa là:

text
tjctf{sine_waves_are_the_best}

Dấu ! là dấu câu trong thông điệp nhìn thấy, không đưa vào flag.

इस प्रश्नोत्तर को साझा करें