2 puan yazan GN⁺ 2024-05-26 | 1 yorum | WhatsApp'ta paylaş
  • Samsung WB850F, DRIMeIII SoC ile Wi-Fi’yi birlikte kullanan ilk modeldi; firmware ZIP’ine dahil edilen partialImage.o.map sayesinde ana SoC firmware analiz edilebildi ve hotspot algılaması atlatılabildi
  • WB850F_FW_210086.zip, 6 partition içeren WB850-FW-SR-210086.bin ile 300 binden fazla satırlık bir linker dökümü içeriyor; buradan Main_Image’ın gerçek ARM firmware’i olduğu doğrulanabildi
  • Ghidra analizinde, string adresleri arasındaki farkı kullanarak Main_Image için 0xc0004000 base adresini bulmak ve .text fonksiyon adlarını dönüştürüp symbol olarak içe aktarmak kilit adımdı
  • Hotspot karar fonksiyonu DevHTTPResponseStart, AP’nin doğrulanıp doğrulanmadığını HTTP 200’de Yahoo domain cookie’siyle veya 301/302/307 redirect URL’sinin başlarındaki yahoo. string’iyle belirliyor
  • Yahoo’nun HTTPS’e redirect etmesiyle yahoo. konumu kodun izin verdiği aralığın dışına çıktı; samsung-nx-emailservice patch’inden sonra WB850F’nin fotoğraf upload’u başarılı oldu

WB850F firmware ZIP’inin yapısı

  • Samsung WB850F, artık kullanımdan kalkmış iLauncher uygulamasından sonra bile Samsung’un hâlâ firmware ve destek dosyalarını yayımladığı az sayıdaki modelden biri
  • WB850F_FW_210086.zip içinde şu dosyalar bulunuyor
    • GPS_FW/BASEBAND_FW_Flash.mbin
    • GPS_FW/BASEBAND_FW_Ram.mbin
    • GPS_FW/Config.BIN
    • GPS_FW/flashBurner.mbin
    • FWUP
    • partialImage.o.map
    • WB850-FW-SR-210086.bin
    • wb850f_adj.txt
  • FWUP, firmware test/otomasyon modülü için bir script gibi görünen yalnızca upgrade all string’ini içeriyor
  • wb850f_adj.txt, GPS firmware’ini upgrade eden ve ilgili dosyaları silen daha karmaşık bir script
  • GPS ile ilgili script’ler ve GPS_FW klasörü bu analiz kapsamı dışında bırakıldı

partialImage.o.map: linker dökümü olan bir harita

  • partialImage.o.map, 300 binden fazla satırlık bir metin dosyası; partialImage.o için linker çıktısını ve bağlanan dosyanın tüm bellek haritasını içeriyor
  • .text section’ında sysInit, archPwrDown, DevHTTPResponseStart, DevHTTPResponseData, DevHTTPResponseEnd gibi fonksiyon adları yer alıyor
  • .data section’ında sysBus, sysCpu, sysBootLine gibi veri symbol’ları bulunuyor
  • Bu dosya, firmware içindeki kodu ve fonksiyon adlarını eşleştiren bir symbol haritası olarak kullanılıyor

WB850-FW-SR-210086.bin header’ı ve partition table’ı

  • WB850-FW-SR-210086.bin dosyasına binwalk ile bakıldığında HTML, PNG, JPEG header’ları, VxWorks header’ı ve çeşitli Unix path’leri görünüyor; ancak net bir partition veya filesystem ortaya çıkmıyor
  • İlk 1 KB hex dump edildiğinde firmware version’ı 210086 sonrasında 0x00 0x06 geliyor, ardından FW_UP/ONBL1.bin gibi dosya adları görünüyor
  • Her record’un 60 byte’lık bir yapı olduğu; 32 byte sıfır padding’li string, iki little-endian integer ve 20 byte sıfır padding’li partition adından oluştuğu analiz edildi
  • İki integer sırasıyla uzunluk ve dosya içi offset olarak yorumlandı
  • Toplam 6 record olduğu için 0x00 0x06, firmware version string’inin bitiş veya padding byte’ı ile 1 byte’lık partition sayısı olarak yorumlandı
  • Yeniden oluşturulan partition’lar

    • FW_UP/ONBL1.bin
      • Boyut: 196 byte, offset: 0x0000800, partition adı: ONBL1
    • FW_UP/ONBL2.bin
      • Boyut: 46KB, offset: 0x00008c4, partition adı: ONBL2
    • [WB850]DSC_5KEY_WB850
      • Boyut: 30MB, offset: 0x000bef4, partition adı: Main_Image
    • RomFS/SPID.Rom
      • Boyut: 48MB, offset: 0x1d2b32c, partition adı: Resource
    • FW_UP/WB850.HEX
      • Boyut: 19KB, offset: 0x4c75f2c, partition adı: OIS
    • FW_UP/skin.bin
      • Boyut: 36MB, offset: 0x4c7acb2, partition adı: SKIN
    • Partition çıkarma için DRIMeIII firmware partition çıkarma aracı yazılıp kullanıldı

Kod ve veri partition’larını ayırmak

  • Çıkarma aracı partition adına göre dosyaları çıkarıp .bin uzantısı ekliyor
  • Yalnızca file sonucu, Main_Image.bin’in OpenPGP Secret Key sanılması gibi nedenlerle sınırlı fayda sağlıyor
  • ONBL1 ve ONBL2, Main_Image içindeki "BootLoader(ONBL1, ONBL2) Update Done" string’ine bakıldığında birinci ve ikinci aşama bootloader olarak tahmin ediliyor
  • Main_Image gerçek firmware; binwalk -A bu dosyada çok sayıda ARM fonksiyon prologue’u raporluyor
  • Resource ve SKIN büyük container’lar; kamera UI skin’iyle ilgili, SoC üreticisinin sağladığı bir yapılandırma olma ihtimali var
  • OIS, dosya adının aksine gerçek bir HEX değil; özel optik görüntü sabitleme biriminin firmware’i olabilir
  • Analizin odağı Main_Image

Ghidra’da Main_Image’ı map etmek

  • ONBL1, ONBL2, Main_Image adlı üç partition gerçek ARM kodu içeriyor
  • Tipik ARM firmware’i reset vector table’ı 0x0000000 adresine koyar; ancak üç binary’nin de başında lineer kod bulunduğu için henüz bilinmeyen bir adrese yeniden map edilmeleri gerekiyordu
  • Hotspot’un yanlış algılanmasını analiz etmek için şu işler gerekliydi
    • Main_Image’ın map edileceği doğru bellek adresini bulmak
    • partialImage.o.map içindeki symbol adlarını Ghidra’ya yüklemek
    • Hotspot login kararını yanlış tetikleyen fonksiyonu analiz etmek
  • Ghidra’nın Defined Strings sekmesinde "yahoo" arandığında DevHTTPResponseStart() için debug string’i gibi görünen öğeler çıktı
    • DevHTTPResponseStart: url=%s, handle=%x, status=%d
    • DevHTTPResponseStart: This is YAHOO check !!!
    • DevHTTPResponseStart: THIS IS GOOGLE/YAHOO/SAMSUNG PAGE!!!! 111
    • 301/302/307! cannot find yahoo!
  • partialImage.o.map içinde DevHTTPResponseStart 0x321a84 adresinde; Ghidra da aynı offset’te fonksiyonu buldu
  • Debug string pointer değeri ile gerçek string offset’i arasındaki fark 0xc0004000 ile eşleşti; bu yüzden Main_Image için base adresin 0xc0004000 olduğu sonucuna varıldı
  • Ghidra’da base adres sonradan değiştirilemediği için binary’yi projeden kaldırıp base adresi ayarlayarak tekrar içe aktarmak gerekti

Fonksiyon adlarını içe aktarma ve DevHTTPResponseStart analizi

  • Ghidra’nın ImportSymbolScript.py script’i, metin tablolarından toplu symbol içe aktarabiliyor
  • Script her satırda symbol adı, hex adres ve fonksiyon olup olmadığını gösteren f ya da label olup olmadığını gösteren l bekliyor
  • partialImage.o.map içinde yalnızca mevcut .text section’ındaki fonksiyonlar gerektiğinden şu öğeleri hariç bırakmak gerekiyordu
    • Boş satırlar
    • Object file offset’leri
    • .text gibi section label’ları
    • L$_ prefix’li label’lar
    • $ prefix’li local symbol’lar
  • Adreslere Ghidra base adresiyle eşleşmesi için 0xc0004000 eklendi
  • Dönüştürme sonucu sysInit c0004000 f, archPwrDown c0004094 f gibi formatlarda oluşturulup Ghidra’nın Script Manager’ından yüklendi
  • Fonksiyon adları geldikten sonra çeşitli DAT_ alanları pointer olarak işaretlenip debug string’lerine göre parametre adları değiştirilince DevHTTPResponseStart decompile çıktısı okunabilir hale geldi

Hotspot algılama koşulları

  • DevHTTPResponseStart, HTTP response status’u ile URL ve header’lara bakarak Wi-Fi AP’nin doğrulanıp doğrulanmadığını belirliyor
  • HTTP 200 OK response’unda doğrulama başarılı sayılması için response header’da Yahoo domain cookie’si olması gerekiyor
    • Kontrol edilenler domain=.yahoo, Domain=.yahoo, domain=kr.yahoo, Domain=kr.yahoo
    • Koşul sağlanırsa p_request_ongoing 0 yapılır ve browser doğrulanmamış durumdaysa safnotify_auth_ap(0) çağrılır
  • HTTP 301/302/307 redirect’lerinde URL içindeki yahoo. string’i kontrol ediliyor
    • yahoo. yoksa veya url + 11den daha sonra bulunuyorsa Yahoo bulunamamış kabul ediliyor
    • Browser framebuffer açık değilse ve doğrulama da yapılmamışsa safnotify_auth_ap(1) çağrılıyor
    • yahoo. başlarda bulunuyorsa safnotify_auth_ap(0) ile doğrulama başarılı kabul ediliyor
  • Negatif status, iptal edilmiş request gibi false döndürüyor
  • 200 veya redirect olmayan pozitif status’larda sonuç browser framebuffer durumuna göre değişiyor

TLS sonrası bozulan Yahoo kontrolü ve atlatma

  • Kameranın sorguladığı URL http://www.yahoo.co.kr/
  • Doğrudan request atıldığında sunucu HTTP/1.1 301 Moved Permanently ile birlikte Location: https://www.yahoo.com/ adresine redirect ediyor
  • https://www.yahoo.com/ içinde yahoo. substring’i 12. konumda
  • Kod, yahoo.nun ilk 11 konumdan birinde olmasını şart koştuğu için bu kontrol HTTPS geçişinden sonra bozuluyor
  • Hotspot kontrolünü geçmek için DNS record’unu başka bir sunucuya yönlendirmek ve bu sunucunun daha Yahoo’ya benzer bir isme HTTP redirect yapması ya da Yahoo domain cookie’si ayarlaması gerekiyor
  • samsung-nx-emailservice patch’i sonrasında kamera gerçekten bağlanıp fotoğraf upload ediyor

Aynı atlatmanın uygulandığı diğer kameralar

  • Bu analiz, tersine mühendisliği yapılan tek bir fonksiyona dayanarak Samsung WB850F Wi-Fi kameranın hotspot algılamasını anlamayı ve atlatmayı başardı
  • Nihai patch küçüktü; ancak Samsung mühendisinin uyguladığı algılama yöntemi nedeniyle yalnızca packet trace ile atlatma yöntemini tahmin etmek zordu
  • Neyin aranması gerektiği anlaşıldıktan sonra, MSN.com’u sorgulayan kameralara da aynı atlatma uygulandı
  • Bunun sonucunda EX2F, ST200F, WB3xF, WB1100F desteklenen kamera listesine eklendi
  • Main_Image içinde 77 binden fazla fonksiyon var; dijital kamera davranışını daha iyi anlamak için analiz edilecek çok şey kalıyor

1 yorum

 
GN⁺ 2024-05-26
Hacker News yorumları
  • https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3 kısmını daha çok beğendim
    Gerçekten şaşırtıcı bir firmware şifreleme hatası örneği

  • Harika bir çalışma. Tersine mühendislik yöntemini bir eğitime dönüştürmeyi düşünüp düşünmediğini merak ediyorum

    • Aslında bu yazının bir eğitim işlevi görecek kadar yeterli bilgi sağlamasını ummuştum
      Yalnızca Google’da kolayca bulunabilecek kısımları atladım
  • İstediğim tek şey, kamera düğmesiyle bir dSLR fotoğrafı çektiğimde kısa süre sonra o görüntünün Apple Photos’a düşmesi

    • Eskiden fotoğrafları otomatik eşitleyebilen Wi-Fi yerleşik SD kartlar vardı; ancak bu alandaki başlıca oyuncu Eye-Fi kapandı ve modern bulut servisleriyle çalışan yeni bir ürün yapan kimse yok gibi görünüyor
      Akıllı telefonlar tüketici kamerası pazarını neredeyse yok ettiği için talep yetersiz gibi. Bir proje fikri olarak, bir ESP32’yi SD kartın içine sığdırmanın yolunu aramak var
    • Wi-Fi’lı bir Canon dSLR FTP yapabiliyor olmalı
      Telefona, tablete ve web sitesine de bağlanabiliyor, ancak bir uygulama ya da servis gerekiyor. Kameradan doğrudan FTP’ye gönderme dokümanı: https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... sayfa 113. Bağlantı EOS 5D Mark IV (WG) Wi-Fi (Wireless Communication) Function Instruction Manual’a ait
    • Linux çalıştıran Samsung NX1 ve NX500, bir Wi-Fi ağı olduğu sürece JPEG ya da RAW dosyaları herhangi bir çevrimiçi servise yükleyecek şekilde oldukça kolay script edilebilir
      Ne yazık ki 10 yıllık modeller ve ikinci el piyasasında da nadir bulunuyorlar
    • Snapbridge’li Nikon Z serisi bu konuda neredeyse en iyi seçenek
      Wi-Fi ya da Bluetooth üzerinden eşleşiyor; isterseniz iPad’den kamerayı uzaktan kontrol edip ekranı da görebiliyorsunuz
    • Google Photos için zaten mümkün olduğuna göre, bu da mümkün olmalı: https://www.stg-uploader.xyz/