Cryptographic/Compression Algorithms
Last updated
Last updated
AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Eğer bir kod kaydırma işlemleri, XOR'lar ve çeşitli aritmetik işlemler içeriyorsa, büyük ihtimalle bir kriptografik algoritmanın uygulanmasıdır. Burada, her adımı tersine çevirmeye gerek kalmadan kullanılan algoritmayı tanımlamanın bazı yolları gösterilecektir.
CryptDeriveKey
Bu fonksiyon kullanılıyorsa, ikinci parametrenin değerini kontrol ederek hangi algoritmanın kullanıldığını bulabilirsiniz:
Mümkün algoritmalar ve atanan değerlerin tablosu için buraya bakabilirsiniz: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Veri akışını sıkıştırır ve açar.
CryptAcquireContext
Belgelerden: CryptAcquireContext fonksiyonu, belirli bir kriptografik hizmet sağlayıcısı (CSP) içinde belirli bir anahtar konteynerine bir tutamaç almak için kullanılır. Bu döndürülen tutamaç, seçilen CSP'yi kullanan CryptoAPI fonksiyonlarına yapılan çağrılarda kullanılır.
CryptCreateHash
Veri akışının karma işlemini başlatır. Bu fonksiyon kullanılıyorsa, ikinci parametrenin değerini kontrol ederek hangi algoritmanın kullanıldığını bulabilirsiniz:
Mümkün algoritmalar ve atanan değerlerin tablosu için buraya bakabilirsiniz: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Bazen bir algoritmayı tanımlamak gerçekten kolay olabilir çünkü özel ve benzersiz bir değeri kullanması gerekir.
Eğer ilk sabit için Google'da arama yaparsanız, aşağıdakini elde edersiniz:
Bu nedenle, dekompilasyon edilmiş fonksiyonun bir sha256 hesaplayıcısı olduğunu varsayabilirsiniz. Diğer sabitlerden herhangi birini arayabilir ve (muhtemelen) aynı sonucu elde edersiniz.
Eğer kodda önemli bir sabit yoksa, muhtemelen .data bölümünden bilgi yükleniyor demektir. Bu verilere erişebilir, ilk dört kelimeyi gruplayabilir ve yukarıda yaptığımız gibi Google'da arayabilirsiniz:
Bu durumda, 0xA56363C6 için arama yaparsanız, bunun AES algoritmasının tablolarıyla ilişkili olduğunu bulabilirsiniz.
Başlatma aşaması/: 0x00 ile 0xFF (toplamda 256 bayt, 0x100) arasında bir değer tablosu oluşturur. Bu tablo genellikle Yerine Koyma Kutusu (veya SBox) olarak adlandırılır.
Karıştırma aşaması: Önceki oluşturulan tablo üzerinde dönecek (tekrar 0x100 iterasyon döngüsü) ve her bir değeri yarı rastgele baytlarla değiştirerek değiştirecek. Bu yarı rastgele baytları oluşturmak için RC4 anahtarı kullanılır. RC4 anahtarları genellikle 1 ile 256 bayt arasında olabilir, ancak genellikle 5 bayttan fazla olması önerilir. Genellikle, RC4 anahtarları 16 bayt uzunluğundadır.
XOR aşaması: Son olarak, düz metin veya şifreli metin, önceki oluşturulan değerlerle XOR edilir. Şifrelemek ve deşifre etmek için aynı işlev kullanılır. Bunun için, oluşturulan 256 bayt üzerinde bir döngü gerektiği kadar yapılacaktır. Bu genellikle bir dekompilasyon kodunda %256 (mod 256) ile tanınır.
RC4'ü bir dekompilasyon/dekompilasyon kodunda tanımlamak için 0x100 boyutunda 2 döngüye (bir anahtar kullanarak) ve ardından giriş verilerinin 2 döngüde önceden oluşturulan 256 değerle XOR'lanmasıyla muhtemelen %256 (mod 256) kullanılarak kontrol edebilirsiniz.
Yerine koyma kutuları ve arama tabloları kullanımı
Belirli arama tablosu değerlerinin (sabitlerin) kullanımı sayesinde AES'i ayırt etmek mümkündür. Sabit'in ikili dosyada saklanabileceğini veya dinamik olarak oluşturulabileceğini unutmayın.
Şifreleme anahtarı 16'ya bölünebilir olmalıdır (genellikle 32B) ve genellikle 16B'lik bir IV kullanılır.
Kullanan bazı kötü amaçlı yazılımların nadir olduğu ancak örneklerin bulunduğu (Ursnif gibi)
Bir algoritmanın Serpent olup olmadığını belirlemek oldukça basittir, uzunluğuna (son derece uzun fonksiyon) dayanarak.
Aşağıdaki resimde 0x9E3779B9 sabitinin nasıl kullanıldığına dikkat edin (bu sabitin TEA -Tiny Encryption Algorithm gibi diğer kripto algoritmalarında da kullanıldığını unutmayın). Ayrıca döngünün boyutunu (132) ve XOR işlemlerinin sayısını derleme talimatlarında ve örnek kodda fark edin:
Yukarıda belirtildiği gibi, bu kod, içinde atlamaların olmadığı çok uzun bir fonksiyon olarak herhangi bir dekompilatörde görüntülenebilir. Dekompilasyon edilmiş kod aşağıdaki gibi görünebilir:
Bu nedenle, bu algoritmayı tanımlamak için sihirli sayıyı ve başlangıç XOR'larını kontrol ederek, çok uzun bir fonksiyonu görerek ve bazı talimatları (örneğin, 7 ile sola kaydırma ve 22 ile sola döndürme) uzun fonksiyonun bazı talimatlarıyla bir uygulamayla karşılaştırarak mümkündür.
Simetrik algoritmalarından daha karmaşıktır
Sabitler yoktur! (özel uygulamaları belirlemek zordur)
KANAL (bir şifre analizörü) RSA hakkında ipuçları veremez çünkü sabitlere dayanır.
satırda (sol) +7) >> 3
bulunur, aynı şey 35. satırda (sağ) +7) / 8
olarak geçer
satırda (sol) modulus_len < 0x040
kontrol edilirken, 36. satırda (sağ) inputLen+11 > modulusLen
kontrol edilir
3 fonksiyon: Init, Update, Final
Benzer başlatma fonksiyonları
Init
Her ikisini de sabitlere bakarak tanımlayabilirsiniz. SHA_init'in MD5'te olmayan 1 sabiti olduğunu unutmayın:
MD5 Dönüşümü
Daha fazla sabit kullanımına dikkat edin
Verideki kazara değişiklikleri bulma işlevi olduğundan daha küçük ve daha verimlidir
Sabitleri tanımlamak için arama tabloları kullanır
Arama tablosu sabitlerini kontrol edin:
Bir CRC hash algoritması şuna benzer:
Tanınabilir sabitler yoktur
Algoritmayı python'da yazmayı deneyebilir ve benzer şeyleri çevrimiçi arayabilirsiniz
Grafik oldukça büyüktür:
Tanımak için 3 karşılaştırmayı kontrol edin: