Tersine Mühendislik

Tersine Mühendisliğe Giriş: Bir Yazılım Nasıl Parçalanır?

20 Ekim 20238 dk okuma

Tersine mühendislik, sadece bir programın nasıl çalıştığını anlamak değil, aynı zamanda sistemin zaaflarını ve çalışma prensiplerini keşfetme sanatıdır. Çoğu geliştirici yazılımın sadece kaynak kodu seviyesinde nasıl çalıştığıyla ilgilenirken, gerçek bir sistem mühendisi derleyicinin (compiler) kodu nasıl optimize ettiğini bilmek zorundadır.

Neden Assembly Bilmeliyiz?

Derleyiciler yazdığımız yüksek seviyeli kodları makine diline çevirirken birçok optimizasyon yapar. Bu katmanı anlamadan güvenli bir yazılım geliştirmek veya analiz etmek neredeyse imkansızdır. Bir fonksiyon çağrıldığında stack pointer (SP) ve base pointer (BP) bellekte nasıl hareket eder? Argümanlar register'lara (RDI, RSI, RDX...) nasıl yerleşir?

Ghidra ile İlk Adımlar

NSA tarafından açık kaynak hale getirilen Ghidra, statik analiz için mükemmel bir araçtır. Bir .exe veya .elf dosyasını Ghidra'ya yüklediğinizde, sadece disassembly (makine kodunu okuma) yapmakla kalmaz, aynı zamanda harika bir decompiler (kodu C benzeri bir dile çevirme) özelliği sunar.

// Ghidra'nın çözdüğü basit bir şifre kontrol mekanizması örneği
int check_password(char* input) {
    if (strcmp(input, "super_secret_key") == 0) {
        return 1;
    }
    return 0;
}

Yukarıdaki kodu Assembly seviyesinde incelersek, strcmp çağrısından hemen önce CMP ve JNZ (Jump If Not Zero) komutlarını görürüz. Tersine mühendislikte, yazılımı manipüle etmek için genellikle bu "JNZ" komutunu "JZ (Jump If Zero)" ile değiştirmemiz (patchlememiz) yeterlidir.

Sonuç

Sistem seviyesinde düşünmek, sizi sıradan bir programcıdan bir sistem mimarına dönüştürür. Belleğin nasıl tahsis edildiğini ve işlemcinin komutları nasıl işlediğini anlamak, her yazılım geliştiricisinin repertuarında bulunmalıdır.

F
Ferivonus
Sistem Mimarisini İnşa Ediyor.
Reverse EngineeringGhidraAssemblyC++