1. GDB İle Tersine Mühendisliğe Giriş
Bu yazımız linux sistemlerde tersine mühendisliğe giriş niteliğinde olup; temel olarak basit bir C
programı ile debugging yöntemleri üzerine olacaktır. Ön bilgi olarak temel C programlama dili
syntax’ı, linux komut satırı ve gcc, gdb araçları ile ilgili araştırma yapmanız gerekmektedir. Koyu
renkli linklemelere tıklayarak konu ile ilgili referans gösterilen kaynaklara ulaşabilirsiniz.
Bilgisayarda bir uygulama veya donanım için hataları tespit etmek, kodları incelemek ve binary
düzeyde gerçekleştirdiği sistem çağrılarını izlemek güvenli yazılım geliştirme açısından önemlidir.
Reverse enginneering’e giriş için öncelikle PE(Portable Executable) yada ELF gibi dosya formatları
bilinmelidir. Örnek verecek olursak Windows’ta bir uygulamayı(exe) çalıştırdığımız zaman; bir
süreç(process) oluşturulur ve bu süreçlere bir sanal hafıza (virtual memory) tahsis edilir. Sürecin
hafıza blokları kullanılarak uygulama çalışır. Process hafızası üç ana bileşenden oluşur. Bunlar Code
Segment, Data Segment ve Stack segment katmanlarıdır. Code segment(.txt) insanların yazdığı
kodların bulunduğu kısım; Data segment(.data) global ve statik değişkenleri içeren,sanal adres
alanının bir bölümü, Stack segment geçici değerlerin bulunduğu hafıza kısmıdır.
2. Temel dosya işleyiş yapısı bilgisini verdikten sonra önce [ctrl + alt + T] komutunu kullanarak linux
terminalimizi açalım. Daha sonra ise root(linux sistemlerde en yetkili kullanıcı) değilsek; [sudo su
root]
komutunu kullanarak root kullacı olalım. Daha sonra nano editörünü basit bir C uygulaması
oluşturalım. Bunun için [nano ornek.c] komutunu kullanabilirsiniz. Açılan nano editörü ekranında
resimdeki gibi bir küçük C uygulaması hazırlayalım. Ardından ctrl+r(dosyayı oku) ve ctrl+o(dosyaya
yaz) komutlarını kullandıktan sonra ctrl+x(cıkıs) komutu ile nano editöründen cıkalım.
3. Yazdığımız basit C programının nano editöründen kaynak görüntüsü aşağıdaki gibidir. Basit bir
isaretçi tipinde çağrı yapılan bir fonksiyon ve main fonksiyonundan oluşmaktadır.
Şimdi yazdıklarımızı [gcc o
yeni yeni.c] komutu ile derleyelim. Herhangi bir hata yoksa ve derleme
işlemi başarılı ise yukarıdaki yeşil renkli executable(çalıştırılabilir) dosyayı görebilirsiniz. [file yeni]
komutu ile yeni çalıştırılabilir dosyası ile ilgili bilgilere bakabilirsiniz.
4. Daha sonra dosyamızı [./yeni] komutunu vererek çalıştıralım. Programın cıktısı resimdeki gibi
olucaktır. Uygulamamızın calıstığını ekran cıktısı ile görebilirsiniz. Şimdi ise [gdb yeni] komutunu
vererek çalıştıralım. Daha sonra (gdb) run olacak olacak şekilde yeniden deneyelim ve çalıştığını
görebilirsiniz.
Assembly kodlarını görmek için gdb içersine iken [layout asm] komutunu verelim. Daha sonra [printf
"%sn", 0x80484f8] komutunu verelim ve Merhaba Dünya yazısındaki M yi görebilirsiniz.
5. Tersine mühendislik ile ilgili bir çok hex editör, komut satırı aracı ve değişik tool bulunmaktadır.
Burada önemli olan gerekli toolları reversing yaparken gerektiği zamanda kullanmaktır. [readelf h
yeni] komutunu verdiğiniz zaman elf dosya formatı objelerine ulaşabilirsiniz.
6. Debugging, Reverse enginneering’ te çok kullanılan bir araçta hexdump aracıdır. Örnekte
belirttiğimiz dosyamıza [hexdump C
n
100 yeni ] komutunu vererek dosya ile ilgili hexadecimal
olarakta görüntüleyebilirsiniz.
Tersine mühendislik kavramı stuxnet kavramından sonra daha da önem kazandı. İran’da bulunan
Siemens Scada sistemlerinin belirli modülülünün belirli bir ürününde ortaya çıkan stuxnet
vakasında, APT(Advanced Persistent Threat), hedef odaklı gelişmiş ileri düzey bir tehdit olduğu için
7. sadece bilgisayar bilimlerinde değil; elektronik, mekatronik, makina bir çok sistemin farklı şekillerde
istismarının düşünüldüğü söylenmektedir. Tersine mühedislik kavramı sadece scada sistemler,
bilgisayar, yazılım tarafında düşünülmemelidir. Buradan stuxnet ile ilgili videoya ulaşabilirsiniz.