Rehber › Teknikler
Teknikler

LSB Steganografi: Görsele Gizlenen Veri

Bir resme baktığında sadece kediyi ya da manzarayı görürsün, ama o piksellerin içinde gizli bir mesaj saklanıyor olabilir. LSB steganografi, veriyi gözle görülemeyecek kadar küçük değişikliklerle görsele saklamanın en klasik yöntemidir; bu rehberde nasıl çalıştığını ve CTF'te nasıl çıkarıldığını sıfırdan öğreneceksin.

Özet
  • LSB = En Az Anlamlı Bit; her renk kanalının son biti gözle fark edilmeden değiştirilebilir.
  • Gizlenen mesaj, piksellerin son bitleri sırayla okunup 8'erli byte'lara çevrilerek geri elde edilir.
  • PNG ve BMP gibi kayıpsız formatlar LSB için uygundur; JPEG sıkıştırması ham LSB verisini bozar.
  • zsteg otomatik dener, stegsolve bit düzlemlerini görsel olarak taratır; Python PIL ise işi elle yapmanı sağlar.
  • CTF'te resim dosyasında bariz ipucu yoksa akla ilk gelen tekniklerden biri LSB'dir.

LSB Nedir? En Az Anlamlı Bit

Bir resimdeki her piksel renklerden oluşur ve renkler sayılarla ifade edilir. Yaygın bir görselde her piksel Kırmızı (R), Yeşil (G) ve Mavi (B) kanallarına sahiptir. Her kanal 0 ile 255 arasında bir değerdir, yani 8 bitlik bir sayıdır.

Bir sayıyı ikilik (binary) yazdığımızda en sağdaki bit "en az anlamlı bit"tir. İngilizcesi Least Significant Bit, kısaca LSB. Neden "en az anlamlı"? Çünkü o biti değiştirmek sayıyı yalnızca 1 arttırır ya da azaltır.

Örneğin kırmızı değeri 150 olsun:

150 = 1001 0110
151 = 1001 0111   (yalnız son bit değişti)

150 ile 151 arasındaki kırmızı tonu birbirinden ayırt edemezsin; göz için ikisi de aynı renktir. İşte bu görünmez esneklik, veri saklamak için mükemmel bir saklanma yeridir.

Bir Piksel Nasıl Veri Saklar?

Fikir basit: her kanalın son bitini, saklamak istediğimiz mesajın bitleriyle değiştiririz. Görsel neredeyse hiç değişmez ama biz o son bitleri geri okuduğumuzda mesajı buluruz.

Bir harf 8 bittir. Tek bir piksel R, G, B ile 3 bit taşıyabilir. Yani "A" harfini (0100 0001) saklamak için yaklaşık 3 piksele ihtiyacın vardır. Küçük bir resim bile binlerce piksel içerdiğinden, koca bir metni rahatça gizleyebilirsin.

Sıralama şöyle işler:

  1. Mesajı bitlere çevir: MERHABA → 01001101 01000101 ...
  2. Pikselleri baştan sona gez, her kanalın son bitine bir mesaj biti yerleştir.
  3. Mesaj bittikten sonra genellikle bir "dur" işareti (örneğin özel bir bayt) bırakılır ki çıkaran taraf nerede duracağını bilsin.

Python ile Gizleme ve Çıkarma

Mantığı en iyi kodla anlarsın. Aşağıdaki örnekler yalnız kendi bilgisayarında, eğitim amaçlı çalıştırman içindir. Python'un Pillow (PIL) kütüphanesini kullanıyoruz.

Veriyi gizlemek

from PIL import Image

img = Image.open("orijinal.png").convert("RGB")
pikseller = list(img.getdata())

mesaj = "MERHABA"
bitler = "".join(format(ord(c), "08b") for c in mesaj)

yeni = []
idx = 0
for (r, g, b) in pikseller:
    kanallar = [r, g, b]
    for i in range(3):
        if idx < len(bitler):
            # son biti sıfırla, sonra mesaj bitini yerleştir
            kanallar[i] = (kanallar[i] & ~1) | int(bitler[idx])
            idx += 1
    yeni.append(tuple(kanallar))

img.putdata(yeni)
img.save("gizli.png")

Buradaki püf nokta (kanal & ~1) | bit ifadesidir: & ~1 son biti temizler, | bit ise yeni biti oraya koyar.

Veriyi çıkarmak

from PIL import Image

img = Image.open("gizli.png")
pikseller = list(img.getdata())

bitler = ""
for px in pikseller:
    for kanal in px[:3]:      # R, G, B
        bitler += str(kanal & 1)   # sadece son bit

mesaj = ""
for i in range(0, len(bitler), 8):
    byte = bitler[i:i+8]
    if len(byte) < 8:
        break
    mesaj += chr(int(byte, 2))

print(mesaj[:200])

kanal & 1 ifadesi bize sadece son biti verir. Bitleri 8'erli grupladığımızda tekrar harflere dönüşür. Çıktının başında saklı mesajı görürsün.

Araçlar: zsteg ve stegsolve Mantığı

Her seferinde kod yazmak zorunda değilsin. CTF dünyasında iki araç çok sık geçer:

Kısaca: zsteg "otomatik dene", stegsolve ise "gözünle bak" aracıdır. İkisi de aynı temel fikri kullanır: son bitleri okuyup anlamlı bir şey çıkıyor mu diye bakmak.

CTF'te Nasıl Yaklaşılır?

Sana bir resim verildiğinde ve içinde bariz bir ipucu yoksa, izlenecek pratik bir sıra vardır:

  1. Önce strings, exiftool ve binwalk ile dosyanın içinde açık metin ya da gömülü başka dosya var mı bak.
  2. Sonuç yoksa akla LSB gelir: zsteg çalıştır, ardından stegsolve ile bit düzlemlerini gez.
  3. Hâlâ bir şey yoksa Python ile kanalları ve okuma sırasını (RGB yerine BGR, ya da sütun-satır sırası) elle deneyebilirsin.

Bu tekniği pratikle oturtmak için stego kategorisindeki challenge'ları deneyebilirsin. Terimlere yeni başladıysan önce CTF Nedir? sayfasına, ardından adım adım ilerlemek için Rehber ana sayfasına göz atmanı öneririm.

Nasıl Fark Edilir ve Korunulur?

Savunma tarafında da düşünmek işe yarar. Normal bir fotoğrafta son bitler doğal bir düzensizlik taşır; gizli veri eklendiğinde bu bitler beklenmedik biçimde düzenli ya da rastgele hâle gelebilir. Güvenlik araştırmacıları bunu istatistiksel analizle (örneğin ki-kare testi) yakalamaya çalışır: bir görselin LSB'leri "fazla düzgün" görünüyorsa şüphe uyanır.

Korunmanın en basit yolu, güvenilmeyen bir kaynaktan gelen görseli yeniden sıkıştırıp kaydetmektir. Örneğin bir PNG'yi JPEG'e çevirmek ham LSB verisini büyük ölçüde bozar, çünkü JPEG kayıplı sıkıştırma yapar. Bu yüzden LSB için hep kayıpsız formatlar (PNG, BMP) tercih edilir.

Unutma: bu teknikleri yalnız kendi dosyaların üzerinde veya yetkili, eğitim amaçlı ortamlarda denemelisin. Amacımız saldırmak değil, gizlenen veriyi görebilmek ve fark edebilmektir.

Sıkça Sorulan Sorular

LSB steganografi neden çıplak gözle görünmez?

Çünkü her renk kanalının yalnızca son biti değiştirilir; bu da rengi en fazla 1 birim kaydırır. 150 ile 151 tonundaki kırmızıyı insan gözü ayırt edemez, bu yüzden binlerce piksel değişse bile resim aynı görünür.

Hangi dosya formatları LSB için uygun?

PNG ve BMP gibi kayıpsız formatlar uygundur çünkü kaydederken piksel değerlerini aynen korurlar. JPEG kayıplı sıkıştırma yaptığı için ham LSB verisi büyük oranda bozulur; bu nedenle CTF challenge'larında genelde PNG görürsün.

zsteg ile stegsolve arasındaki fark nedir?

zsteg komut satırından çalışır ve olası bit sıralarını, kanalları senin yerine otomatik dener; hızlı bir ilk tarama içindir. stegsolve ise görsel bir araçtır ve her bit düzlemini gözünle incelemeni sağlar, özellikle gizlenen şey metin değil de bir resim ya da QR kod olduğunda çok işe yarar.

Gizli mesajın nerede bittiğini nasıl anlarım?

Genellikle mesajın sonuna özel bir işaret konur; örneğin bir bayrak metni '}' karakteriyle biter ya da özel bir sonlandırıcı bayt eklenir. Çıkarma sırasında bu işareti gördüğünde okumayı durdurabilirsin; işaret yoksa da çıkan metnin başındaki anlamlı kısma bakarsın.

Bu teknikleri gerçek sitelerdeki resimlerde kullanmak yasal mı?

Bu rehber eğitim ve CTF amaçlıdır; teknikleri yalnız kendi dosyaların ya da yetkili olduğun eğitim ortamlarında denemelisin. Başkasının sistemine veya izinsiz verilere yönelik kullanım hukuki sorun doğurur, o yüzden pratiği bu platformdaki challenge'lar gibi güvenli ortamlarda yap.

Hadi pratiğe dök

Bu rehberdeki teknikleri Steganografi kategorisindeki gerçek challenge’larda dene.

Steganografi Challenge’ları →

Devam et