SİBER GÜVENLİK TEMELLERİ TERSİNE MÜHENDİSLİK
Herkese selamlar arkadaşlar serisini yaptığım siber güvenlikçi olacağım serisinin tersine mühendislik bölümündeyiz bu eğitim temel düzeyde olacaktır iyi forumlar.
Tersine Mühendislik Nedir?
Tersine mühendislik bir çeşit analiz dalıdır. Bu analiz dalında bir nesnenin veya sistemin yapısının, işlevinin veya çalışmasının analiz ile keşfedilmesi işlemidir. (Makine veya mekanik alet, elektronik, yazılım programı gibi) parçalarına ayrılıp ve çalışma prensiplerinin detaylı şekilde analizini inceleyen daldır.
x86-64 Nedir?
x86-64 AMD tarafından tasarlanan 64-bitlik bir işlemci mimarisidir. x86-64, x86 mimarisinin bir üst kümesidir, yapısı itibarıyla de onu destekler. x86-64 komut seti AMDnin Athlon 64, Athlon 64 FX, Athlon 64 X2, Turion 64, ve Opteron işlemcilerinde kullanılmaktadır.
x86-64 Montajına Giriş
Bilgisayarlar, bir bilgisayarda görevleri gerçekleştirmek için bayt olarak kodlanmış makine kodunu yürütür. Farklı bilgisayarların farklı işlemcileri olduğundan, bu bilgisayarlarda yürütülen makine kodu işlemciye özeldir. Bu durumda, bugün en yaygın olarak bulunan Intel x86-64 komut seti mimarisine bakacağız. Makine kodu, genellikle, derleme kodu adı verilen kodun daha okunabilir bir biçimiyle temsil edilir. Bu makine kodu genellikle bir dosyanın kaynak kodunu alan ve bazı ara aşamalardan geçtikten sonra bir bilgisayar tarafından çalıştırılabilen makine kodu üreten bir derleyici tarafından üretilir.
Çok fazla ayrıntıya girmeden Intel, önce 16 bitlik bir komut seti inşa ederek başladı, ardından 32 bit ve ardından 64 bit oluşturdu. Tüm bu komut setleri geriye dönük uyumluluk için oluşturulmuştur, bu nedenle 32 bit mimari için derlenen kod 64 bit makinelerde çalışacaktır. Daha önce bahsedildiği gibi, yürütülebilir bir dosya üretilmeden önce, kaynak kod ilk olarak derleme .s dosya uzantısı halinde derlenir, ardından montajcı onu bir nesne programına .o uzantılı dosyaya dönüştürür ve bir bağlayıcıyla yapılan işlemler sonunda onu bir dosya haline getirir ve yürütülebilir.
Assemblyyi açıklamaya başlamanın en iyi yolu, derine dalmaktır fakat konuyu uzatmamak adına anlatmıyorum. Bunu radare2 yapmak için kullanacağız - radare2 , tersine mühendislik ve ikili dosyaları analiz etmek için bir çerçevedir. İkili dosyaları demonte etmek (makine kodunu aslında okunabilir olan Assemblyye çevirmek) ve söz konusu ikili dosyaların hatalarını ayıklamak (bir kullanıcının yürütmede adım atmasına ve programın durumunu görüntülemesine izin vererek) için kullanılabilir.
SSH ile bağlantı kurduktan sonrar2 -d incelenecek dosya komutuyla işlemimize başlıyoruz.
aa komutuyla ilk şeylerden biri r2‘den programı analiz etmesini istemektir. (5-10 dk sürebilir.)
Taramaya devam etmekte.
Taramamız bitti. Hangisi en yaygın analiz komutudur. Yürütülebilir dosyadaki tüm sembolleri ve giriş noktalarını analiz eder. Bu durumda analiz, fonksiyon adlarının, akış kontrol bilgilerinin ve çok daha fazlasının çıkarılmasını içerir. r2 komutları genellikle tek bir karaktere dayanır, bu nedenle komutlar hakkında daha fazla bilgi almak kolaydır. Yani, genel yardım için şunu çalıştırabiliriz ? veya belirli bir özellik hakkında daha fazla bilgi edinmek istersek, şunları sağlayabiliriz; a?
Analiz tamamlandıktan sonra, analize nereden başlayacağınızı bilmek istersiniz, bunun için afl komutu yardımcı olacaktır.
Burada görüldüğü gibi aslında mainde bir fonksiyon var. Diyelim komutu çalıştırarak montaj kodu incelenecek. PDF Print D isassembly Fonksiyonu bunu yapabilmek için pdf @main komutunu çalıştırıyoruz.
Assembly dilinin özü, aşağıdakileri yapmak için kayıtların kullanılmasını içerir;
# Verileri bellek ve kayıt arasında aktarın ve tam tersi
# Kayıtlar ve veriler üzerinde aritmetik işlemler gerçekleştirir.
# Kontrolü programın diğer bölümlerine aktarın Mimari x86-64 olduğundan, kayıtlar 64 bittir ve Intel‘in 16 kayıt listesi vardır;
Kayıtları kullanarak bellek manipülasyonu ile uğraşırken, dikkate alınması gereken başka durumlar da vardır;
# (Rb, Ri) = HafızaKonumu[Rb + Ri]
# D(Rb, Ri) = HafızaKonumu[Rb + Ri + D]
# (Rb, Ri, S) = HafızaKonumu(Rb + S * Ri]
# D(Rb, Ri, S) = HafızaKonumu[Rb + S * Ri + D]
Şimdi bir kesme noktası belirlediğimize göre, programı kullanarak dc komutuyla çalıştıralım.
Biz kesme noktasına ulaşana kadar programı yürütecektir. Kesme noktasına ulaştığımızda ve ana işlevi yazdırdığımızda, geçerli talimat olan rip, yürütmenin nerede durduğunu gösterir. Değişkenin içeriğini görüntülemek için px @memoryadress komutunu kullanıyoruz..
Registerin değerini görmek için dr komutunu kullanabiliriz;