히토리

CTF 스테가노그래피 (스펙트로그램) audacity 문제 제작하기 본문

정보보안/CTF 문제풀이

CTF 스테가노그래피 (스펙트로그램) audacity 문제 제작하기

hitori-life 2025. 7. 25. 05:20

우선 텍스트를 WAV 파형에 글자를 삽입해서 시각적으로 글자가 보이도록 (스펙트로그램으로 봤을때)

하는 방법은 오디오 스테가노그래피 또는 스펙트로그램 아트라고 합니다.

WAV 파일의 주파수 성분을 조작해 스펙트로그램 상에 이미지가 드러나게 만드는 방식입니다.

아래는 이미지에 텍스트가 적힌 파일을 생성하는 코드입니다.

 

from PIL import Image, ImageDraw, ImageFont

img = Image.new('L', (1500, 300), color=0)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 120)

draw.text((10, 100), "hitori-life{bocchi_the_rock!}", fill=255, font=font)
img.save("ctf_text.png")

 

PIL(파이썬 이미지 처리 라이브러리)를 로드합니다.

'L'은 0~255 밝기 값만 사용하며, 0은 검정색(배경)을 의미합니다.

1500에 300은 가로세로 픽셀 크기입니다.

arial 글꼴을 사용해서 120크기로 font 변수에 넣습니다.

텍스트 시작 좌표는 10에 100이며, 255 fill을 주어 흰색으로 표시합니다.

이미지는 ctf_text.png로 저장합니다.


이제 이미지를 WAV 파형으로 넣을 수 있도록 하겠습니다.

 
import numpy as np
from PIL import Image
import scipy.io.wavfile as wavfile

# 이미지 열기
img = Image.open("ctf_text.png").convert("L")
img = img.transpose(Image.FLIP_TOP_BOTTOM)

width, height = img.size
duration = 5
samplerate = 44100
samples = int(samplerate * duration)
audio = np.zeros(samples)

# 이미지 픽셀을 주파수로 변환
for x in range(width):
    t = int((x / width) * samples)
    for y in range(height):
        brightness = img.getpixel((x, y)) / 255.0
        if brightness > 0.1:
            freq = 300 + (y / height) * 3700
            audio[t:t+1000] += brightness * np.sin(2 * np.pi * freq * np.arange(1000) / samplerate)

# 정규화 및 저장
audio = np.int16(audio / np.max(np.abs(audio)) * 32767)
wavfile.write("spectrogram_ctf.wav", samplerate, audio)
 

 

이미지 파일을 L(grayscale로 엽니다)

duration은 WAV 파일의 시간 초이며, samplerate는 초당 샘플 수 (CD음질)

samples는 오디오 샘플 수, audio는 0으로 채워진 배열에 사인파를 누적해서 그려 넣습니다.

정규화에서는 audio 신호를 정규화하여 최댓값을 32767로 맞춥니다(이는 16bit WAV 형식입니다)

 

 

spectrogram_ctf.wav
0.42MB

 

 


이제 audacity 도구를 이용해서 파형을 확인해보겠습니다.

(보통 다른 노래와, 만든 WAV파형을 합쳐서 문제가 출제됩니다)

트랙 전체 선택을 하고

우클릭 후 스펙트로그램으로 변환합니다.

속도를 적절하게 설정하고, 화면 크기도 적당하게 수정하면 글자가 보이는 것을 볼 수 있습니다.

'정보보안 > CTF 문제풀이' 카테고리의 다른 글

CCE2021 FORENSIC (DIamond, Ruby, Pearl) 문제풀이  (0) 2025.07.25
mctf qr code  (0) 2025.07.25
revenge of baby shock  (1) 2025.07.25
Magically Delicious  (1) 2025.07.25