Cryptographic/Compression Algorithms
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)
Eğer bir kod sağa ve sola kaydırma, XOR ve çeşitli aritmetik işlemler kullanıyorsa, bunun bir kriptografik algoritmanın uygulanması olması oldukça olası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:
Olası algoritmalar ve atanan değerleri kontrol etmek için buraya bakın: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Verilen bir veri tamponunu sıkıştırır ve açar.
CryptAcquireContext
Belgelerden: CryptAcquireContext fonksiyonu, belirli bir kriptografik hizmet sağlayıcısı (CSP) içindeki belirli bir anahtar konteynerine bir tanıtıcı almak için kullanılır. Bu döndürülen tanıtıcı, seçilen CSP'yi kullanan CryptoAPI fonksiyonlarına yapılan çağrılarda kullanılır.
CryptCreateHash
Bir veri akışının hash'ini başlatır. Bu fonksiyon kullanılıyorsa, ikinci parametrenin değerini kontrol ederek hangi algoritmanın kullanıldığını bulabilirsiniz:
Olası algoritmalar ve atanan değerleri kontrol etmek için buraya bakın: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Bazen, bir algoritmayı tanımlamak gerçekten kolaydır çünkü özel ve benzersiz bir değer kullanması gerekir.
Eğer ilk sabiti Google'da ararsanız, bu sonucu alırsınız:
Bu nedenle, decompile edilmiş fonksiyonun bir sha256 hesaplayıcısı olduğunu varsayabilirsiniz. Diğer sabitlerden herhangi birini arayabilirsiniz ve (muhtemelen) aynı sonucu alırsınız.
Eğer kodda herhangi bir önemli sabit yoksa, bu .data bölümünden bilgi yüklüyor olabilir. Bu veriye erişebilir, ilk dword'u gruplandırabilir ve daha önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz:
Bu durumda, eğer 0xA56363C6 ararsanız, bunun AES algoritmasının tablolarıyla ilgili olduğunu bulabilirsiniz.
3 ana bölümden oluşur:
Başlatma aşaması/: 0x00 ile 0xFF arasında değerler içeren bir tablo oluşturur (toplam 256 bayt, 0x100). Bu tablo genellikle Yer Değiştirme Kutusu (veya SBox) olarak adlandırılır.
Karıştırma aşaması: Daha önce oluşturulan tabloyu döngü ile geçer (0x100 yineleme döngüsü) ve her değeri yarı rastgele baytlarla değiştirir. Bu yarı rastgele baytları oluşturmak için RC4 anahtarı kullanılır. RC4 anahtarları 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, daha önce oluşturulan değerlerle XOR'lanır. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle decompile edilmiş kodda %256 (mod 256) ile tanınır.
Bir disassembly/decompile edilmiş kodda RC4'ü tanımlamak için, 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verisinin 2 döngüde daha önce oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen %256 (mod 256) kullanarak
yer değiştirme kutuları ve arama tabloları kullanımı
belirli arama tablo değerlerinin (sabitlerin) kullanımı sayesinde AES'i ayırmak mümkündür. _Not edin ki sabit ikili ya da dinamik olarak oluşturulabilir.
şifreleme anahtarı 16'ya (genellikle 32B) tam bölünebilir olmalıdır ve genellikle 16B'lik bir IV kullanılır.
Bunu kullanan bazı kötü amaçlı yazılımlar bulmak nadirdir ama örnekler vardır (Ursnif)
Bir algoritmanın Serpent olup olmadığını belirlemek için uzunluğuna (son derece uzun fonksiyon) dayanarak basit.
Aşağıdaki görüntüde 0x9E3779B9 sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca TEA -Küçük Şifreleme Algoritması gibi diğer kripto algoritmaları tarafından da kullanıldığını not edin). Ayrıca döngünün boyutunu (132) ve disassembly talimatlarındaki ve kod örneğindeki XOR işlemleri sayısını not edin:
Daha önce belirtildiği gibi, bu kod herhangi bir decompiler içinde çok uzun bir fonksiyon olarak görselleştirilebilir çünkü içinde atlamalar yoktur. Decompile edilmiş kod aşağıdaki gibi görünebilir:
Bu nedenle, bu algoritmayı büyülü sayıyı ve ilk XOR'ları kontrol ederek, çok uzun bir fonksiyon görerek ve uzun fonksiyonun bazı talimatlarını bir uygulama ile karşılaştırarak tanımlamak mümkündür (örneğin, 7'ye kaydırma ve 22'ye döndürme).
Simetrik algoritmalardan daha karmaşık
Sabit yok! (özel uygulamaların belirlenmesi zordur)
KANAL (bir kripto analizörü) RSA hakkında ipuçları gösteremiyor çünkü sabitlere dayanıyor.
satırda (solda) +7) >> 3
var, bu da 35. satırda (sağda) +7) / 8
ile aynıdır.
satır (solda) modulus_len < 0x040
kontrol ediyor ve 36. satırda (sağda) inputLen+11 > modulusLen
kontrol ediliyor.
3 fonksiyon: Init, Update, Final
Benzer başlatma fonksiyonları
Init
Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. Not edin ki sha_init'in MD5'de olmayan 1 sabiti vardır:
MD5 Dönüşümü
Daha fazla sabit kullanıldığına dikkat edin
Daha küçük ve daha verimli çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır
Sabitleri tanımlamak için arama tabloları kullanır
arama tablo sabitlerini kontrol edin:
Bir CRC hash algoritması şöyle görünür:
Tanınabilir sabit yok
Algoritmayı python'da yazmayı deneyebilir ve çevrimiçi benzer şeyler arayabilirsiniz
Grafik oldukça büyük:
Tanımak için 3 karşılaştırmayı kontrol edin:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)