คลัง
stego

WAV Steganography

WAV เป็น audio format แบบ lossless ที่ซ่อนข้อมูลได้หลายแบบ — spectrogram (ซ่อนภาพ/ข้อความในความถี่), LSB ของ sample, DTMF tone, Morse code, หรือ channel ซ้าย-ขวาต่างกัน บทนี้ลงลึกทุกเทคนิค audio พร้อมเครื่องมือและการอ่าน spectrogram

IntermediateAdvanced#wav#audio#stego#spectrogram#lsb#dtmf#sonic-visualiser#ctf

1. ภาพรวม — audio ซ่อนได้หลายชั้น

WAV เก็บ sample เสียงดิบ (PCM) แบบ lossless จึงซ่อนได้หลายวิธีที่ format อย่าง MP3 ทำไม่ได้ จุดสำคัญคือต้องตรวจ หลายมิติ: ฟังเสียง (Morse/DTMF/เสียงพูดกลับด้าน), ดู spectrogram (ภาพ/ข้อความในความถี่), อ่าน LSB ของ sample, และเทียบ channel L/R การเจอขึ้นอยู่กับว่าผู้ซ่อนใช้ชั้นไหน

เทคนิคสัญญาณบ่งชี้เครื่องมือ
Spectrogram imageเสียง noise/หวีดแปลกๆSonic Visualiser, Audacity
LSB ของ sampleฟังปกติ แต่ไฟล์ใหญ่ผิดWavSteg, Python
DTMF tonesเสียงโทรศัพท์กดปุ่มdtmf decoder, multimon-ng
Morse codeเสียง beep สั้น-ยาวฟัง / ดู waveform
Reversed audioเสียงพูดกลับด้านAudacity reverse
L/R channel ต่างสองหูได้ยินไม่เท่ากันAudacity แยก channel

2. Spectrogram — เทคนิคที่พบบ่อยสุด

เทคนิคยอดนิยม: ผู้ซ่อนวาดข้อความ/flag เป็นภาพในโดเมนความถี่ เมื่อเปิดดู spectrogram (กราฟความถี่-เวลา) จะเห็น flag เป็นตัวอักษรลอยอยู่ เสียงที่ได้ยินจะเป็น noise/หวีด

  1. 1เปิดไฟล์ใน Sonic Visualiser (ดีสุดสำหรับงานนี้)
  2. 2เพิ่ม layer: Pane → Add Spectrogram
  3. 3ปรับ scale/color จนเห็นข้อความชัด (ลอง log scale, ปรับ window size)
  4. 4อ่าน flag ที่เห็นในภาพ
  5. 5ทางเลือก: Audacity → เลือก track → Spectrogram view; หรือ sox สร้างภาพ
สร้าง spectrogram ด้วย sox (command line)Linux
# สร้างภาพ spectrogram จาก WAV
sox audio.wav -n spectrogram -o spectro.png
# ปรับความละเอียด/ช่วงความถี่
sox audio.wav -n spectrogram -o spectro.png -x 2000 -y 1000
# เปิด spectro.png ดู flag

# ถ้าไฟล์เป็น format อื่น แปลงเป็น wav ก่อน
ffmpeg -i audio.mp3 audio.wav
Sonic Visualiser ปรับแบบ interactive ได้ดีกว่า แต่ sox สร้างภาพเร็วสำหรับ triage

3. LSB ของ audio sample

เหมือน LSB ของภาพ แต่ทำกับ sample เสียง (16-bit PCM) — แทนที่ bit ต่ำสุดของแต่ละ sample ฟังแล้วแทบไม่ต่าง

extract LSB จาก WAVLinux
# WavSteg (จาก stego-lsb)
stegolsb wavsteg -i audio.wav -o output.bin -n 1   # n = bit ต่อ sample
# ลอง n=1,2 และ output ดู file type
file output.bin
อ่าน LSB เองด้วย Python (wave + numpy)Linux
import wave, numpy as np
w = wave.open("audio.wav","rb")
frames = w.readframes(w.getnframes())
samples = np.frombuffer(frames, dtype=np.int16)

bits = "".join(str(s & 1) for s in samples)   # LSB ของแต่ละ sample
# แปลงทีละ 8 bit
msg = "".join(chr(int(bits[i:i+8],2)) for i in range(0, len(bits)-7, 8))
print(msg[:300])
# variant: ถ้า stereo ลองแยก channel (samples[0::2] / samples[1::2])
ถ้า stereo (2 channel) sample สลับ L/R — ลองแยก channel ก่อนอ่าน

4. DTMF, Morse, reversed, channel

  • DTMF (เสียงกดปุ่มโทรศัพท์): ใช้ multimon-ng -a DTMF audio.wav หรือเว็บ DTMF decoder → ได้ลำดับตัวเลข
  • Morse code (beep สั้น-ยาว): ดู waveform ใน Audacity → ถอดเป็น .-/-. หรือใช้ morse decoder
  • Reversed: Audacity → Effect → Reverse (บางทีเสียงพูดถูกกลับด้าน)
  • Speed/pitch: ลองเปลี่ยน speed — เสียงที่เร็ว/ช้าผิดอาจเป็นข้อความ
  • L/R channel: Audacity → Split Stereo to Mono → ฟังแยก / subtract สอง channel (ข้อมูลอาจอยู่ในผลต่าง)
multimon-ng decode DTMF/MorseLinux
# DTMF
multimon-ng -a DTMF -t wav audio.wav
# Morse (CW)
multimon-ng -a MORSE_CW -t wav audio.wav
# ต้องเป็น wav mono 22050Hz — แปลงด้วย sox ถ้าจำเป็น
sox audio.wav -r 22050 -c 1 conv.wav

5. Workflow ตรวจ WAV

  1. 1exiftool + binwalk + strings — เช็ค metadata/append ก่อน
  2. 2ฟังเสียง — ปกติ? noise? beep (Morse)? เสียงกดปุ่ม (DTMF)?
  3. 3ดู spectrogram (Sonic Visualiser) — มีภาพ/ข้อความไหม
  4. 4ดู waveform — pattern แปลก/Morse
  5. 5LSB extract (WavSteg / Python)
  6. 6แยก L/R channel, ลอง reverse/speed

6. Quick Reference

  • ตรวจหลายชั้น: ฟัง → spectrogram → waveform → LSB → channel
  • spectrogram: Sonic Visualiser / sox -n spectrogram (พบบ่อยสุด)
  • LSB: stegolsb wavsteg / Python wave+numpy (s & 1)
  • DTMF/Morse: multimon-ng -a DTMF / MORSE_CW
  • reversed/speed: Audacity Effect
  • stereo → แยก L/R, ลองผลต่าง channel

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติโจทย์แจกไฟล์ .wav มา มีแค่ Kali เปล่าๆ — WAV ซ่อนได้หลายมิติ (spectrogram, LSB, DTMF, Morse) ทำตามลำดับนี้ทีละขั้น เริ่มจากฟัง/ดูภาพก่อนค่อยไป LSB

  1. 1พิมพ์ file audio.wav + exiftool audio.wav + binwalk audio.wav — เช็ค metadata/ไฟล์ฝังก่อนเสมอ
  2. 2ฟังไฟล์เสียงเปล่าๆ ก่อน — ปกติ? มี noise/หวีดแปลกๆ? beep สั้นยาว (Morse)? เสียงกดปุ่มโทรศัพท์ (DTMF)?
  3. 3เปิดไฟล์ใน Sonic Visualiser แล้ว Pane → Add Spectrogram ดูว่ามีข้อความ/ภาพลอยอยู่ในความถี่ไหม (เทคนิคที่พบบ่อยสุด)
  4. 4ถ้าไม่มี Sonic Visualiser พร้อมใช้ ลอง sox audio.wav -n spectrogram -o spectro.png เปิดดูภาพแทน
  5. 5เห็นข้อความใน spectrogram แล้ว → อ่านตัวอักษรออกมาเป็น flag ได้เลย จบ
  6. 6ถ้า spectrogram เรียบเฉย ลอง stegolsb wavsteg -i audio.wav -o output.bin -n 1 (ลอง n=1,2) แล้ว file output.bin
  7. 7ถ้าได้ยินเสียง DTMF ให้ multimon-ng -a DTMF -t wav audio.wav; ถ้าเป็น Morse ให้ multimon-ng -a MORSE_CW -t wav audio.wav
  8. 8ถ้าเสียงฟังดูแปลก (พูดกลับด้าน/เร็วผิดปกติ) เปิด Audacity แล้วลอง Effect → Reverse หรือปรับ speed
  9. 9ถ้าเป็น stereo ลองแยก L/R channel ใน Audacity ฟังแต่ละข้าง หรือลองผลต่างของสอง channel ด้วย Python (numpy)
ไล่ตรวจ WAV ทีละมิติ — ติดไปไหนต่อ
เจอ flag ชั้นนอกไหม?
✅ เจอ→ จบ ได้ flag
❌ ไม่เจอ→ ดู spectrogram ต่อ
Sonic Visualiser / sox spectrogram
เทคนิคที่พบบ่อยสุดในโจทย์ WAV
เห็นข้อความ/ภาพในความถี่ไหม?
✅ เห็น→ อ่านเป็น flag จบ
❌ ไม่เห็น→ ลอง LSB ของ sample
stegolsb wavsteg -n 1/2
LSB ของ 16-bit PCM sample
output.bin เป็นไฟล์/ข้อความอ่านออกไหม?
✅ ใช่→ จบ ได้ flag/ไฟล์ลับ
❌ เป็น noise/binary มั่ว→ ฟังหา DTMF/Morse/reverse
multimon-ng (DTMF/Morse) / Audacity reverse/speed
ฟังเสียงเป็นหลักฐานว่าจะลองทางไหน
เจอ pattern ไหม?
✅ เจอ→ ถอดรหัสเป็น flag จบ
❌ ไม่เจอ→ แยก L/R channel ลองผลต่าง
แยก L/R channel + diff (numpy)
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
เช็ค metadata/ไฟล์ฝังexiftool, binwalksudo apt install libimage-exiftool-perl binwalkaperisolve.com
ดู spectrogramsox, sonic-visualiser, audacitysudo apt install sox sonic-visualiser audacity-
ดึง LSB จาก samplestegolsb (stego-lsb), pythonpip install stego-lsb-
ถอด DTMF/Morsemultimon-ngsudo apt install multimon-ng-
แปลงฟอร์แมต/sample ratesox, ffmpegsudo apt install sox ffmpeg-
วิเคราะห์ waveform ละเอียดaudacitysudo apt install audacity-
ถอดรหัส/แปลงข้อความที่ได้--CyberChef, dcode.fr
🚑 ถ้าตันสนิท ลองท่าถัดไป: stego-mp3 ถ้าไฟล์จริงถูกบีบอัดมาจาก MP3 (เทคนิคต่างกัน), lsb ถ้าอยากเข้าใจกลไก LSB ให้ลึกก่อนเขียน solver เอง, exiftool ถ้ายังไม่เช็ค metadata ให้ทั่ว, binwalk ถ้ายังไม่เช็คไฟล์ต่อท้าย — audio มีชั้นซ่อนได้เยอะกว่ารูป อย่าหยุดแค่ spectrogram ถ้าโจทย์บอกว่ามีมากกว่า 1 flag

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้