Dosyalara göre steganografi: verileri doğrudan sektörlerde gizleme

Kısa tanıtım

Steganografi, eğer hatırlamıyorsa, bazı kaplarda bilgi saklıyor. Örneğin, resimlerde (tartışılan burada и burada). Ayrıca dosya sisteminin servis tablolarındaki verileri de gizleyebilirsiniz (bu hakkında yazılmıştır) burada), ve hatta TCP protokolü hizmet paketlerinde. Ne yazık ki, tüm bu yöntemlerin bir dezavantajı vardır: Bilgileri bir kaba fark edilmeden "eklemek" için, kabın iç yapısının özelliklerini dikkate alan kurnaz algoritmalara ihtiyacınız vardır. Ve kabın manipülasyona karşı direnciyle ilgili sorunlar ortaya çıkıyor: örneğin, resmi biraz düzenlerseniz gizli bilgiler kaybolur.

Kurnaz algoritmalar ve verilerle yapılan ince manipülasyonlar olmadan bir şekilde bunu yapmak ve yine de kabın işlevselliğini ve gizli verilerin kabul edilebilir düzeyde güvenliğini sağlamak mümkün müdür? İleriye baktığımda şunu söyleyeceğim: evet, yapabilirsin! Hatta bir yardımcı program bile sunacağım.

Yöntemin kanlı ayrıntıları

Temel fikir alnına bir darbe kadar basittir: Diskte işletim sisteminin asla yazmadığı (veya nadir durumlarda yazmadığı) alanlar vardır. Bu alanları kurnaz algoritmalar kullanarak arama ihtiyacını ortadan kaldırmak için artıklık kullanacağız - yani gizli bilgilerimizi diskin tüm sektörlerinde birçok kez kopyalayacağız. Ardından, tüm bu ihtişamın yanı sıra, gerekli bölümleri oluşturabilir, dosya sistemlerini formatlayabilir, dosyalar yazabilir ve işletim sistemleri kurabilirsiniz - yine de gizli verilerin bir kısmı kaydedilecek ve geri alınabilecek ve tekrarlanan çoğaltma bize yardımcı olacaktır. orijinal bütünü parçalardan bir araya getirin.

Bu yöntemin avantajı açıktır: dosya formatına ve hatta kullanılan dosya sisteminin türüne bağlı değiliz.

Dezavantajları da bence açıktır:

  • Gizli veriler yalnızca tüm diskin tamamen yeniden yazılması ve ardından kullanıcının görebileceği içeriğin yeniden oluşturulmasıyla değiştirilebilir. Ancak diski bir görüntüden yeniden oluşturan yazılımı kullanamazsınız: bu aynı zamanda önceki gizli verileri de yeniden oluşturur.
  • Gizli verilerin hacmi ne kadar büyük olursa, bazı bilgilerin kaybolma olasılığı da o kadar artar.
  • Verilerin diskten alınması uzun zaman alabilir. Birkaç dakikadan birkaç güne kadar (modern diskler büyüktür).

Şimdi ayrıntılara geçelim.

Gizli verileri diskin her yerine bulaştırırsanız, bunların yalnızca çıplak gözle gizleneceği açıktır. Bakışınızı örneğin bir disk düzenleyiciyle donatırsanız, veriler tüm ihtişamıyla görünecektir. Bu nedenle, verileri görünmeyecek şekilde şifrelemek iyi bir fikir olacaktır. Basit ama zevkli bir şekilde şifreleyeceğiz: aes256-cbc algoritmasını kullanarak. Kullanıcıdan şifreleme anahtarını isteyeceğiz ve iyi bir şifre bulmasına izin vereceğiz.

Bir sonraki soru “iyi” verileri kötü verilerden nasıl ayırt edebileceğimizdir. Burada bir sağlama toplamı bize yardımcı olacaktır, ancak basit bir değil, SHA1. Ve ne? Git için yeterince iyi, dolayısıyla bize de yakışacak. Karar verildi: Saklanan her bilgi parçasına bir sağlama toplamı sağlarız ve şifre çözüldükten sonra eşleşirse, bu şifre çözmenin başarılı olduğu anlamına gelir.

Ayrıca parça numarasına ve gizli verilerin toplam uzunluğuna da ihtiyacınız olacak. Parça numarası, hangi parçaların şifresini çözdüğümüzün ve hangilerinin kaldığını takip etmek içindir. Gereksiz verileri (yani dolguyu) yazmamak için son parçayı işlerken toplam uzunluk bizim için yararlı olacaktır. Hala bir başlığımız olduğundan, gizli dosyanın adını oraya ekleyeceğiz. Nasıl açılacağını tahmin etmemek için şifre çözüldükten sonra faydalı olacaktır.

Yöntemin pratikte test edilmesi

Kontrol etmek için en yaygın aracı - flash sürücüyü alalım. Deneyler için oldukça uygun olan 1 GB kapasiteli eski bir tane buldum. Siz de benim gibi, fiziksel medyayla uğraşmamak, onu bir dosya üzerinde - bir disk görüntüsü üzerinde - test etmek fikrini ortaya attıysanız, o zaman hemen söyleyeceğim: işe yaramayacak. Böyle bir "diski" biçimlendirirken Linux dosyayı yeniden oluşturur ve kullanılmayan tüm sektörler sıfırlarla doldurulacaktır.

Linux'lu bir makine olarak maalesef balkonda bulunan Raspberry Pi 3'te bir hava durumu istasyonu kullanmak zorunda kaldım, orada çok fazla bellek yok, bu yüzden büyük dosyaları gizlemeyeceğiz. Kendimizi maksimum 10 megabayt boyutuyla sınırlıyoruz. Ayrıca çok küçük dosyaları gizlemenin de bir anlamı yoktur: yardımcı program, verileri diske 4 KB'lık kümeler halinde yazar. Bu nedenle, aşağıda kendimizi 3 kb'lik bir dosyayla sınırlayacağız - bu tür bir kümeye uyuyor.

Flash sürücüyü aşamalı olarak inceleyeceğiz ve her aşamadan sonra gizli bilgilerin okunabilir olup olmadığını kontrol edeceğiz:

  1. 16 KB küme boyutuyla FAT16 formatında hızlı biçimlendirme. Windows 7'nin dosya sistemi olmayan bir flash sürücüyle yapmayı önerdiği şey budur.
  2. Flash sürücüyü her türlü çöple% 50 oranında doldurmak.
  3. Flash sürücüyü her türlü çöple% 100 oranında doldurmak.
  4. FAT16 formatında “uzun” biçimlendirme (her şeyin üzerine yazma).

Beklendiği gibi ilk iki test tam bir zaferle sonuçlandı: yardımcı program, flash sürücüden 10 megabayt gizli veriyi başarıyla çıkarmayı başardı. Ancak flash sürücünün kapasitesi dosyalarla doldurulduktan sonra bir hata oluştu:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Gördüğünüz gibi, yalnızca 158 kümenin şifresi başarıyla çözüldü (632 kilobayt ham veri, bu da 636424 bayt yük sağlar). Burada 10 megabayt almanın bir yolu olmadığı açık, ancak yine de bu kümeler arasında açıkça kopyalar var. Bu şekilde 1 megabaytı bile kurtaramazsınız. Ancak bir flash sürücüden, biçimlendirilip kapasitesine yazıldıktan sonra bile 3 kilobaytlık gizli veriyi kurtaracağımızı garanti edebiliriz. Ancak deneyler, böyle bir flash sürücüden 120 kilobayt uzunluğunda bir dosyayı çıkarmanın oldukça mümkün olduğunu gösteriyor.

Son test maalesef tüm flash sürücünün üzerine yazıldığını gösterdi:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Tek bir küme bile hayatta kalmadı... Üzücü ama trajik değil! Biçimlendirmeden önce, flash sürücüde ve zaten içinde bir dosya sistemi olan bir bölüm oluşturmaya çalışalım. Bu arada, fabrikadan tam olarak bu formatla geldi, bu yüzden şüpheli bir şey yapmıyoruz.
Flash sürücüdeki kullanılabilir alanın biraz azalması bekleniyor.

Tamamen dolu bir diskte 10 megabaytın gizlenememesi de oldukça bekleniyor. Ancak artık şifresi başarıyla çözülen kümelerin sayısı iki katından fazla arttı!

Total clusters read: 250752, decrypted: 405

Ne yazık ki, bir megabaytı parçalardan bir araya getirmek imkansızdır, ancak iki yüz kilobaytı kolaydır.

Peki, son 4. kontrolle ilgili haberler bu sefer sevindirici: böyle bir flash sürücüyü tamamen biçimlendirmek tüm bilgilerin yok olmasına yol açmadı! 120 kilobaytlık gizli veri, kullanılmayan alana mükemmel şekilde sığar.

Test özeti tablosu:

Dosyalara göre steganografi: verileri doğrudan sektörlerde gizleme

Biraz teorileştirme: boş alan ve kullanılmayan sektörler hakkında

Sabit sürücünüzü daha önce bölümlere ayırdıysanız, diskteki boş alanın tamamını ayırmanın her zaman mümkün olmadığını fark etmiş olabilirsiniz. İlk bölüm her zaman bir miktar girintiyle başlar (genellikle 1 megabayt veya 2048 sektör). Son bölümün arkasında, kullanılmayan sektörlerin küçük bir "kuyruğu" da kalıyor. Ve bazen bölümler arasında nadiren de olsa boşluklar olabiliyor.

Yani disk üzerinde normal çalışma sırasında erişilemeyen sektörler mevcut ancak bu sektörlere veri yazılabiliyor! Bu da onu okumak anlamına geliyor. Diskin başlangıcındaki boş alanda bulunan bir bölüm tablosu ve önyükleyici kodunun da bulunması için ayarlanmıştır.

Bölümlere bir süre ara verip diske tabiri caizse kuşbakışı bakalım. Burada diskte boş bir bölümümüz var. İçinde bir dosya sistemi oluşturalım. Diskteki bazı sektörlerin silinmeden kaldığını söyleyebilir miyiz?

E-e-e - davul sesi! Cevap neredeyse her zaman evet olacaktır! Aslında, çoğu durumda, bir dosya sistemi oluşturmak, diske yalnızca birkaç blok hizmet bilgisi yazmaktan ibarettir ve aksi takdirde bölümün içeriği değişmez.

Ve ayrıca - tamamen ampirik olarak - dosya sisteminin her zaman son sektöre kadar kendisine ayrılan tüm alanı işgal edemeyeceğini varsayabiliriz. Örneğin, küme boyutu 16 kilobayt olan bir FAT64 dosya sisteminin, boyutu 64 kilobaytın katı olmayan bir bölümü tamamen işgal edemeyeceği açıktır. Böyle bir bölümün sonunda, kullanıcı verilerinin saklanması için erişilemeyen birkaç sektörden oluşan bir "kuyruk" olması gerekecektir. Ancak bu varsayım deneysel olarak doğrulanamadı.

Dolayısıyla steganogram için mevcut alanı maksimuma çıkarmak için daha büyük küme boyutuna sahip bir dosya sistemi kullanmanız gerekir. Gerekli olmasa bile (örneğin bir flash sürücüde) bir bölüm de oluşturabilirsiniz. Boş bölümler oluşturmaya veya tahsis edilmemiş alanlar bırakmaya gerek yok; bu, ilgilenen vatandaşların dikkatini çekecektir.

Deneyler için yardımcı program

Yardımcı programın kaynak koduna dokunabilirsiniz burada

Oluşturmak için Qt sürüm 5.0 veya üzeri ve OpenSSL'ye ihtiyacınız olacak. Bir şeyler işe yaramazsa steganodisk.pro dosyasını düzenlemeniz gerekebilir.

Küme boyutunu 4 KB'tan 512 bayta (gizli dosya.h'de) değiştirebilirsiniz. Aynı zamanda hizmet bilgilerinin maliyeti de artacaktır: başlık ve sağlama toplamı sabit 68 baytlık bir alanı kaplar.

Yardımcı programı elbette kök kullanıcı haklarıyla ve dikkatli bir şekilde çalıştırmanız gerekir. Belirtilen dosya veya cihazın üzerine yazmadan önce hiçbir soru sorulmayacak!

Keyfini çıkarın.

Kaynak: habr.com

Yorum ekle