strings ve od Komutları ile Binary ve Okunaksız Dosyaların İçeriğini İnceleme

Bir sistem yöneticisinin hayatında mutlaka karşılaşacağı an şudur: Önünüzde garip bir dosya var, ne olduğunu bilmiyorsunuz, cat ile açmaya çalışıyorsunuz ve terminal bir anda anlamsız karakterler, zil sesleri ve bozuk çıktılarla dolup taşıyor. İşte tam bu noktada strings ve od komutları hayat kurtarıcı oluyor. Bu iki araç, binary dosyaların içinde ne saklı olduğunu anlamak, şüpheli dosyaları analiz etmek ve okunaksız verilerle başa çıkmak için sysadmin araç kutusunun vazgeçilmez parçaları.

strings Komutu: Binary Dosyalardaki İnsan Okunabilir Metni Bulmak

strings komutu, adından da anlaşılacağı gibi bir dosyanın içindeki yazdırılabilir karakter dizilerini (string) çıkarıp size gösterir. Çalışma mantığı basit: Dosyayı byte byte tarar, art arda gelen yazdırılabilir karakterleri bulur ve bunları ekrana basar. Varsayılan olarak en az 4 karakter uzunluğundaki dizileri yakalar.

Temel Kullanım

En basit kullanım şekliyle, bir binary dosyaya uygulayın:

strings /usr/bin/ls

Bu komut ls binary’sinin içindeki tüm okunabilir metinleri döker. Versiyon bilgisi, hata mesajları, kullanılan kütüphane isimleri, yardım metinleri… Hepsini görebilirsiniz. Güvenlik perspektifinden bakıldığında bu çıktı oldukça değerli.

Minimum Uzunluk Parametresi

Varsayılan 4 karakter sınırı bazen çok fazla gürültü üretir, bazen de kısa ama önemli stringleri kaçırırsınız. -n parametresiyle bunu ayarlayabilirsiniz:

# En az 8 karakter uzunluğundaki stringleri bul
strings -n 8 /usr/bin/curl

# Çok kısa stringleri de dahil et (3 karakter ve üzeri)
strings -n 3 suspicious_file.bin

Şüpheli bir binary analiz ediyorsanız -n 3 ile daha kapsamlı tarama yapın. Zararlı yazılımlar bazen kısa komut dizileri veya tek kelimelik sistem çağrıları içerebilir.

Offset Bilgisiyle Çalışmak

Bulunan stringlerin dosyadaki konumunu bilmek istediğinizde -t parametresi devreye girer:

# Ondalık (decimal) offset ile
strings -t d /usr/bin/bash | grep "version"

# Hexadecimal offset ile
strings -t x malware_sample.bin | head -50

# Octal offset ile
strings -t o firmware.bin

Bu özellik özellikle bir hex editörle veya od komutuyla birlikte çalışırken çok işe yarar. Bir stringin tam olarak dosyanın hangi bölümünde olduğunu bilirseniz, etrafındaki binary veriye de bakabilirsiniz.

Gerçek Dünya Senaryosu: Şüpheli Binary Analizi

Diyelim ki sunucunuza izinsiz erişim olmuş olabilir ve /tmp dizininde şüpheli bir dosya buldunuz:

# Önce dosya tipini anla
file /tmp/.hidden_process

# strings ile içeriğine bak
strings /tmp/.hidden_process | grep -E "(http|ftp|ssh|passwd|shadow|wget|curl|nc|bash|sh)"

# Sistem çağrılarını ara
strings /tmp/.hidden_process | grep -E "^[a-z_]+$" | sort -u

Bu komut dizisi size dosyanın ne tür network aktivitesi yapabileceğini, hangi sistem dosyalarına erişmeye çalışabileceğini ve hangi shell komutlarını çağırabileceğini gösterir. Gerçek bir olayda böyle bir tarama, zararlı yazılımın C2 sunucu adresini veya kullandığı tekniği ortaya çıkarabilir.

Dinamik Kütüphaneleri ve Bağımlılıkları İncelemek

strings sadece zararlı yazılım analizinde değil, günlük sistem yönetiminde de kullanışlıdır:

# Bir uygulamanın bağlandığı kütüphane isimlerini bul
strings /usr/bin/nginx | grep ".so"

# Konfigürasyon dosyası yollarını bul
strings /usr/sbin/sshd | grep "/"

# Hata mesajlarını çek
strings /usr/bin/python3 | grep -i "error|warning|fail"

Bir uygulama beklenmedik bir şekilde crash olduğunda ve log’larda yeterli bilgi yoksa, binary’nin içindeki string’lere bakarak hangi dosyalara baktığını, hangi environment variable’ları okuduğunu anlayabilirsiniz.

od Komutu: Dosyaları Farklı Sayı Tabanlarında Görüntüleme

od (octal dump) komutu, strings‘ten farklı bir yaklaşım benimser. Her şeyi gösterir, gizlemez. Binary veriyi oktal, hexadecimal, decimal veya ASCII formatında sunar. İsmi “octal dump” olsa da günümüzde çoğunlukla hex dump için kullanılıyor.

Temel Kullanım

# Varsayılan oktal dump
od /etc/hostname

# Hexadecimal dump (en yaygın kullanım)
od -x /etc/hostname

# Her ikisini birden: hex ve ASCII
od -A x -t x1z /etc/hostname

od‘nun çıktısı ilk bakışta korkutucu görünebilir ama mantığını kavradıktan sonra çok okunabilir hale geliyor. Sol taraftaki sütun offset (konum), sağ taraftakiler ise o konumdaki byte değerleri.

od Parametreleri

-A: Adres (offset) formatını belirler

  • -A x: Hexadecimal offset
  • -A d: Decimal offset
  • -A o: Octal offset (varsayılan)
  • -A n: Offset gösterme

-t: Çıktı formatını belirler

  • -t x1: Her byte’ı hex olarak göster
  • -t x2: İkişer byte grupla, hex
  • -t d1: Her byte’ı decimal olarak göster
  • -t o1: Her byte’ı oktal olarak göster
  • -t a: Named ASCII karakterleri kullan
  • -t c: Yazdırılabilir karakterleri, kontrol karakterlerini escape ile göster

-j: Belirtilen sayıda byte’ı baştan atla (jump)

-N: Belirtilen sayıda byte’ı oku

-w: Satır başına kaç byte yazılacağını belirle

-v: Tekrar eden satırları asterisk ile gizleme, hepsini göster

-z: Satır sonuna ASCII karşılıklarını ekle

Pratik od Kullanımı

Bir dosyanın ilk birkaç byte’ına bakarak dosya tipini anlamak için:

# İlk 16 byte'ı hex ve ASCII ile göster
od -A x -t x1z -N 16 unknown_file.bin

# Magic byte'ları kontrol et
od -t x1 -N 4 file.pdf | head -1

PDF dosyaları %PDF ile başlar (hex: 25 50 44 46), PNG dosyaları 89 50 4E 47 ile, ELF binary’ler 7F 45 4C 46 ile. Bu magic byte’ları kontrol etmek, dosyanın gerçek tipini anlamanın en güvenilir yolu.

Belirli Bir Konumdan Okuma

# 100. byte'dan itibaren 32 byte'ı göster
od -A x -t x1z -j 100 -N 32 binary_file.bin

# Dosyanın ortasındaki bir bölümü incele
od -A x -t x1z -j 0x200 -N 64 firmware.bin

Bu özellik firmware analizi veya dosya formatı araştırması yaparken son derece kullanışlı. Header bölümünü atlayıp data bölümüne direkt atlamak istediğinizde -j parametresi tam burada.

od ile Karakter Analizi

# Kontrol karakterlerini göster
od -c /var/log/syslog | grep -E "\\[rnt]" | head -20

# CR LF karakterlerini bul (Windows satır sonu)
od -c problematic_file.txt | grep "\r"

# Null byte'ları bul
od -t x1 config_file | grep " 00"

Windows’tan Linux’a aktarılan dosyalarda sıklıkla rn problemi yaşanır. od -c ile bu karakterleri görünür kılabilir ve nerede olduklarını tespit edebilirsiniz.

strings ve od’yu Birlikte Kullanmak

Bu iki komutun gerçek gücü, birlikte kullanıldığında ortaya çıkıyor.

Senaryo: Corrupt Bir Log Dosyası

Üretim sunucusunda bir uygulama binary formatında log yazıyor ama dosya aniden bozulmuş. Ne kadarı okunabilir?

# Önce okunabilir içeriği çek
strings -n 6 -t x app_binary.log > readable_strings.txt

# İlginç bir string buldunuz, tam konumunu öğrenmek istiyorsunuz
# strings çıktısında hex offset görüyorsunuz: 0x1a4f
# od ile o bölgeye bakın
od -A x -t x1z -j 0x1a4f -N 64 app_binary.log

# Etrafındaki veriyi de incele
od -A x -t x1z -j 0x1a00 -N 128 app_binary.log

Senaryo: Firmware İncelemesi

IoT cihazlarıyla veya embedded sistemlerle uğraşıyorsanız firmware binary’lerini analiz etmek durumunda kalabilirsiniz:

# Firmware'deki tüm URL'leri bul
strings -n 10 router_firmware.bin | grep -E "https?://"

# IP adresi kalıplarını ara
strings router_firmware.bin | grep -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"

# Versiyon bilgilerini çek
strings router_firmware.bin | grep -iE "version|v[0-9]+.[0-9]+"

# od ile binary header'ı analiz et
od -A x -t x1z -N 256 router_firmware.bin

Bu yaklaşımla firmware’in hangi sunuculara bağlandığını, hangi default credential’ları içerdiğini ve versiyon bilgilerini çıkarabilirsiniz. Güvenlik araştırmacıları bu teknikleri düzenli olarak kullanır.

Senaryo: Database Binary Dosyalarını İnceleme

MySQL veya PostgreSQL’in binary log dosyalarını, dump dosyalarını incelemek gerekebilir:

# MySQL binary log'unda okunabilir içerik
strings -n 8 /var/lib/mysql/mysql-bin.000001 | grep -v "^[^a-zA-Z]*$" | head -100

# Silinen tabloların isimlerini bulmaya çalış
strings /var/lib/mysql/mysql-bin.000001 | grep -iE "DROP|DELETE|TRUNCATE"

# od ile binary log header'ını incele (MySQL binary log magic number: fe 62 69 6e)
od -A x -t x1z -N 4 /var/lib/mysql/mysql-bin.000001

xxd ile od Karşılaştırması

xxd komutu da benzer işleri yapar ama bazı durumlarda od‘dan daha okunabilir çıktı üretir. İkisini karşılaştırmalı bilmek faydalı:

# od ile hex dump
od -A x -t x1z test_file.bin

# xxd ile aynı işlem (daha temiz çıktı)
xxd test_file.bin

# xxd ile sadece belirli bir aralık
xxd -s 0x100 -l 64 test_file.bin

# xxd'nin avantajı: binary patch yapabilmek
xxd test_file.bin > test_file.hex
# hex dosyayı düzenle
xxd -r test_file.hex > test_file_patched.bin

od POSIX standardında yer aldığı için her Linux/Unix sistemde bulunur. xxd ise genellikle vim paketiyle gelir, bazı minimal sistemlerde olmayabilir. Bu yüzden od öğrenmek daha taşınabilir bir beceri.

Gerçek Güvenlik Senaryosu: Rootkit İzlerini Aramak

Bir sistem yöneticisinin kabuslarından biri: Sunucunun ele geçirildiğinden şüpheleniyorsunuz. Sistem araçları manipüle edilmiş olabilir. Ne yaparsınız?

# /bin/ls'in orijinal boyutuyla karşılaştır (paket yöneticisinden)
strings /bin/ls | wc -l
rpm -V coreutils | grep /bin/ls  # RHEL/CentOS için
debsums coreutils | grep /bin/ls  # Debian/Ubuntu için

# Şüpheli binary'de beklenmedik network referansları var mı?
strings /bin/ps | grep -E "(http|ftp|nc|netcat|wget|curl|/dev/tcp)"

# Şüpheli system call referansları
strings /sbin/ifconfig | grep -iE "(hide|stealth|filter|hook)"

# Kernel module'lerde şüpheli stringler
for mod in $(find /lib/modules -name "*.ko" 2>/dev/null); do
    result=$(strings "$mod" | grep -E "(hide|rootkit|stealth)" 2>/dev/null)
    if [ -n "$result" ]; then
        echo "Şüpheli: $mod"
        echo "$result"
    fi
done

Bu tür bir tarama kesin sonuç vermez, ama ilk triaj aşamasında hangi dosyaların daha detaylı inceleneceğine karar vermenize yardımcı olur.

Script ile Otomatik Analiz

Birden fazla şüpheli dosyayı analiz etmeniz gerektiğinde bu işi otomatize etmek mantıklı:

#!/bin/bash
# binary_analyze.sh - Şüpheli dosyaları hızlıca analiz et

SUSPICIOUS_PATTERNS="(http://|https://|ftp://|/etc/passwd|/etc/shadow|/bin/sh|/bin/bash|nc |wget |curl |chmod |chown |iptables)"

analyze_file() {
    local file="$1"
    echo "=== Analiz: $file ==="
    echo "Dosya tipi: $(file "$file")"
    echo "Boyut: $(stat -c%s "$file") byte"
    echo ""
    
    echo "--- Magic Bytes ---"
    od -A x -t x1z -N 8 "$file" | head -1
    echo ""
    
    echo "--- Şüpheli Stringler ---"
    strings -n 6 "$file" | grep -E "$SUSPICIOUS_PATTERNS"
    echo ""
    
    echo "--- Network İlgili Stringler ---"
    strings -n 4 "$file" | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}|:[0-9]{4,5}"
    echo "========================"
}

for file in "$@"; do
    if [ -f "$file" ]; then
        analyze_file "$file"
    fi
done

Kullanımı:

chmod +x binary_analyze.sh
./binary_analyze.sh /tmp/suspicious1 /tmp/suspicious2 /var/tmp/.hidden

Sonuç

strings ve od komutları, görünürde basit araçlar gibi dursa da doğru senaryoda ne kadar güçlü olduklarını ilk kullandığınızda anlarsınız. Binary bir dosyanın içinde ne saklı olduğunu birkaç saniyede anlamak, bir güvenlik olayında ilk triajı hızlıca yapmak, corrupt dosyaları analiz etmek… Bunların hepsi bu iki komutla mümkün.

strings için en önemli alışkanlık: Her zaman çıktıyı grep ile filtreleyin. Ham strings çıktısı genellikle çok gürültülüdür. Ne aradığınızı biliyorsanız, direkt ona odaklanın. od için ise offset ve format parametrelerini iyi öğrenin, -A x -t x1z kombinasyonu en sık kullanacağınız şekil olacak.

Bu araçları file, ldd, nm, objdump gibi komutlarla kombinlediğinizde, binary analiz için güçlü bir araç setiyle donanmış olursunuz. Üstelik bunların hepsi, hiçbir ek yazılım kurmanıza gerek kalmadan her Linux sistemde hazır bulunuyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir