Disassembly'e Giriş: IDA Pro ve Ghidra ile Kod Analizi
Makine kodunu assembly diline çevirerek bir programın mantığını satır satır çözümleme.
Disassembly, bir çalıştırılabilir dosyanın ikili (binary) makine kodunu, insan tarafından okunabilir assembly diline çeviren süreçtir. Statik ve dinamik analizin sınırlarının yetersiz kaldığı durumlarda (örneğin bir zararlı yazılımın tam olarak hangi şifreleme algoritmasını kullandığını veya belirli bir koşulun nasıl tetiklendiğini anlamak için), disassembly kaçınılmaz hâle gelir.
Disassembler mi, Decompiler mi?
- Disassembler (IDA Pro, Ghidra'nın disassembly modu): Makine kodunu doğrudan assembly diline çevirir (örneğin
mov eax, [ebp-4]) — düşük seviyede, ama her zaman doğru bir çeviridir. - Decompiler (Ghidra'nın Decompile özelliği, Hex-Rays): Assembly'i daha da ileri götürüp C benzeri sözde-kod (pseudocode) üretmeye çalışır (örneğin
x = y + 1;) — okunması çok daha kolaydır ama %100 doğru olmayabilir, decompiler'ın "tahmin" ettiği noktalar olabilir.
Modern analistler genelde ikisini birlikte kullanır: decompiler ile genel mantığı hızlıca kavrayıp, kritik/şüpheli noktalarda ham assembly'e inerek doğrulama yapar.
Fonksiyon Tanıma ve Çağrı Grafiği (Call Graph)
Ghidra/IDA gibi araçlar, bir binary'i yüklediğinde otomatik olarak fonksiyon sınırlarını tespit etmeye çalışır (genelde derleyicinin bıraktığı standart prologue/epilogue kalıplarına — push ebp; mov ebp, esp gibi — dayanarak). Ortaya çıkan call graph (hangi fonksiyonun hangisini çağırdığı), bir analistin binary'nin genel mimarisini hızlıca kavramasını sağlar — genelde main'e benzer bir giriş noktasından başlayıp dallara ayrılan bir ağaç yapısı gibi düşünülebilir.
Kriptografik Sabitlerin Tanınması
Bir analistin en değerli becerilerinden biri, assembly kodunda bilinen kriptografik algoritmaların "imzalarını" tanımaktır. Örneğin AES'in S-box tablosundaki belirli sabit değerler (0x63, 0x7C, 0x77, 0x7B... gibi) veya SHA-256'nın başlangıç hash değerleri (0x6a09e667 gibi), kodda görüldüğünde o algoritmanın kullanıldığının güçlü bir kanıtıdır — bu, ransomware analizinde şifreleme algoritmasını (ve dolayısıyla teorik olarak kurtarma ihtimalini) belirlemek için kritik bir tekniktir.
Temel x86 Assembly Kalıpları
Bir analist, sık karşılaşılan birkaç kalıbı tanıyarak analiz hızını ciddi şekilde artırabilir:
cmp eax, 0 ; eax'i 0 ile karşılaştır
je loc_401050 ; eşitse zıpla (if-else yapısının derlenmiş hâli)
loop loc_401020 ; bir sayaç sıfır olana kadar döngü (for/while yapısının derlenmiş hâli)
Bu tür kalıpları tanımak, decompiler'ın ürettiği pseudocode olmadan bile, ham assembly'den bir programın kontrol akışını (if/else, döngüler) çıkarmayı mümkün kılar.
Pratik Senaryo
Bir analist, bir ransomware örneğinin şifreleme rutinini anlamaya çalışıyor. Statik string analizi hiçbir anlamlı ipucu vermiyor çünkü tüm string'ler şifrelenmiş görünüyor. Ghidra'da fonksiyonu decompile ettiğinde, döngü içinde belirli bir tablodan (lookup table) byte'ların XOR'landığı bir işlem görüyor; bu tablodaki sabit değerleri AES S-box değerleriyle karşılaştırdığında birebir eşleştiğini fark ediyor. Bu bulgu, örneğin özel bir şifreleme değil, standart AES kullandığını kanıtlıyor — bu bilgi, güvenlik topluluğunun daha sonra bu ailenin anahtar yönetimindeki bir zafiyeti bulup ücretsiz bir kurtarma aracı geliştirmesi için kritik bir başlangıç noktası oluyor.
Bu makale, disassembly ve ters mühendisliğin orta-ileri seviye teknik bir özetidir; SiberCrew ekibi tarafından hazırlanmış özgün içeriktir.