Tersine Mühendislik Nedir?

Tersine Mühendislik Nedir?

Capture The Flag etkinliklerinin olmazsa olmazı, siber güvenlik dünyasında önemli bir yere sahip olan, bir aygıt yada yazılımın ne iş yaptığının analiz ile anlamaya çalışılması işlemi olan Tersine Mühendislik (Reverse Engineering), Makine Mühendisliği, Elektronik Mühendisliği, Yazılım Mühendisliği ve Kimya Mühendisliği gibi alanları ilgilendiriyor olsa da bu yazıda, daha çok yazılım mühendislerini ve siber güvenlik dünyası ile ilgili olan tarafına ağırlık vererek Tersine Mühendislik nedir konusunu ele alacağım.

Tersine Mühendislik

Tersine Mühendislik, insan yapımı herhangi bir şeyden bilgi çıkarma veya tasarımı tasarlama sürecidir. Konsept, bilgisayarlardan veya modern teknolojiden çok önce var olmuştur ve muhtemelen sanayi devriminin günlerine dayanmaktadır. Bir araştırmacının atomun veya insan aklının “detaylı planı yada modelini” çözmeye çalıştığı bilimsel araştırmaya benzetmek yanlış olmaz. Tersine Mühendislik ile konvansiyonel bilimsel araştırmalar arasındaki fark, bilimsel araştırmada araştırılan eserin doğal bir fenomen olmasının aksine tersine mühendislikte araştırılan eser insan yapımıdır.

Tersine Mühendislik olarak adlandırılmasa bile aslında çok sayıda insan tarafından uygulanan oldukça popüler bir hobi olarak geçmişte karşımıza çıkmaktadır. Örnek verecek olursak, modern elektroniklerin ilk günlerinde radyo ve televizyon seti gibi modern cihazların birçok insanı nasıl şaşırttığını, onları parçalarına ayırmanın ve içeride neler olduğunu görmenin yaygın bir uygulama haline geldiğini hatırlayalım. Bunun aslında bir tersine mühendislik olduğunu kabul edilebilir bir gerçek.

Yazılımda Tersine Mühendislik

Yazılımda Tersine Mühendislik, tasarım ve uygulama bilgilerini elde etmek için bir yazılım sistemini kısmen veya tamamen analiz etme uygulamasıdır. Yazılımda Tersine Mühendislik, kod kırma, bulmaca çözme, programlama ve mantıksal analiz gibi çeşitli sanatları birleştirmektedir. Tersine Mühendislik becerileri, virüsleri ve kötü amaçlı yazılımları tespit etmek ve etkisiz hale getirmek ve fikir hakkını korumak için de kullanılmaktadır.

Reversing işlemi, kötü amaçlı yazılım zincirinin her iki ucunda da yaygın olarak kullanılmaktadır. Kötü amaçlı yazılım geliştiricileri genellikle işletim sistemlerindeki ve diğer yazılımlardaki güvenlik açıklarını bulmak için reversing işlemini gerçekleştirmektedir. Bir tarafta yazılan bir yazılımın açıklarını tespit etmek için tersine mühendislik yapılırken, diğer tarafta ise bu  açıklıkları sömürmek için yazılmış zararlı yazılımların tespiti için tersine mühendislik yapılmaktadır.

Zararlı yazılım analistlerinin çokça haşır neşir olduğu Tersine Mühendislik terimi, zararlı yazılımların ve ya bir programın incelenmesi açısından iki yöntem kullanılmaktadır. İlk olarak incelenecek olacak programın disassembly kodları incelenebilir, bir diğer yöntem olarak programın dinamik olarak çalışabilirliği, fonksiyonları adım adım test edilebilir. Bu yöntemlere Statik Analiz ve Dinamik Analiz adları verilmektedir.

Statik ve Dinamik Analiz

Statik analiz, programı çalıştırmadan yapılan, uygulamaya içten dışa bakan bir test, analiz işlemidir. Statik analizde programı çalıştırmak yerine kaynak kodu, bayt kodu ve ya uygulama binary dosyaları incelenir. Uygulama verileri ve kontrol yolları modellenir ve daha sonra uygulamanın incelenmesi amacına uygun belirlenmiş noktalara bakılarak analiz edilir. Statik analiz işlevsellikten ziyade uygulamanın iç yapısının test edilmesidir.

Dinamik analiz, gerçek veya sanal bir işlemci üzerinde programı çalıştırarak gerçekleştirilen analizdir. Dinamik analizin etkili olabilmesi için, hedef programın neredeyse tüm olası çıktıları kapsayacak yeterli test girdileriyle çalıştırılması gerekir. Kodu çevrimdışı olarak almak yerine, programı çalıştırarak inceleme amacına uygun olarak güvenlik açıkları gözlemlenebilir yada program davranışı izlenerek örnek bir malware incelemesi gerçekleştirilebilir.

Tersine Mühendislik Araçları

IDA PRO : C++ dilinde yazılmış interaktif bir assembler olan bu araç tersine mühendislik alanında başarılı, ticari bir araçtır. Debug özelliği de bulunmaktadır.

Ghidra : Java ve C++ dilleriyle NSA tarafından geliştirilmiş olan bu araç IDA PRO’ya benzer debug gibi birkaç özelliği free olarak içerisinde barındırmaktadır fakat yavaşlık ve fazla hafıza tüketimi eksisi olan açık kaynak bir araçtır.

OllyDgb : C dili ile yazılmış bir açık kaynak x86 debugger. Kali Linux’ un bazı sürümlerinde kurulu olarak gelmektedir.

Radare2 : C dili ile yazılmış, statik ve dinamik analize imkan veren bu disassembler açık kaynak bir araçtır.

GDB : C dili ile yazılmış, dinamik analizde çokça tercih edilen açık kaynak bir araçtır.

UYGULAMA

Tersine Mühendislik konusunu verilen teorik bilgi ile pekiştirmek adına basit bir örnekle göstermeye çalışacağım. Bu uygulama da Capture The Flag tarzında bir platform üzerinden alınmış binary dosyasını inceleyerek tersine mühendislik ile flag değerinin elde edilmesini göstereceğim.

İnceleyeceğimiz dosyayı radare2 aracını kullanarak analiz edeceğiz. Bunun için “ r2 –A reverse.bin “ komutunu çalıştırarak analiz işlemini başlatıyoruz. Pdf( Print disassembly of function ) fonksiyonunu kullanarak “ [email protected]” komutu ile main fonksiyonunun disassembly kodlarını inceliyoruz.

İlk olarak “SuperSeKretKey” string değerinin tanımlanması ve bazı char değerlerinin byte dizinde tanımlanması karşımıza çıkmakta.

İlk olarak bir “printf” fonksiyonunun çağrıldığı yani bir şeyin print edildiği ve sonrasında çağrılan “ scanf “ fonksiyonu ile girdi alındığı görülmekte. Ardından scanf ile alınan ifadenin yazdırıldığını ve bir string compare fonksiyonu ile alınan değer ve s2 olarak görülen yani “ SuperSeKretKey “ string değerinin karşılaştırılması sonucunun true olması durumunda 0x400975 adresine gidileceği, false olması durumda ise exit fonksiyonunun devreye girdiği görülmekte.

Yani burada bizden girdi olarak istenen ilk input değeri “SuperSeKretKey” olarak girdiğimiz durumda program devam edecek aksi takdirde sonlanacaktır. True olması halinde program devam ederek bir scanf fonksiyonu daha çağırarak yeni bir girdi almakta olduğu görülmekte. Fakat burada alınan girdiden sonra çağrılan strcmp fonksiyonunun sonucuna göre olabilecek bir değişken işlevsellik bulunmadığından ikinci input bir önem arz etmiyor. 0x00400968 adresinde bulunan jne ise karşılaştırmanın true olması halinde, ki hep true gelecektir, 0x400976 adresine jump edilmesini ifade etmektedir. Yani fnc.00400978 fonksiyonu çağrılmadan program sonlanır.

Flag değerini elde edebilmemiz için 0x400968 adresindeki jump komutunu bypass etmemiz gerekmekte. Bunun için öncelikle “ oo+ “ ile read-write formatında binary dosyamızı yeniden açıyoruz ve “ s 0x400968 “ komutu ile 0x400968 adresini aratıyoruz. “ wx 9090 “ ile belirlemiş olduğumuz 0x400968 adresine iki adet nop yani işlem yok girdisi yapıyoruz.

Main fonksiyonunu yeniden incelediğimizde ilgili kısımda iki adet nop girdisi olduğunu görmüş olacağız.

Böylelikle 0x400968 adresini jump ederek programın ilerlemesini sağlamış olduk. Artık programı çalıştırarak ilk olarak “SuperSeKretKey”  inputunu ve daha sonra random bir ifade girerek flag değerini elde edebiliriz.

Ek olarak, Android SSL Pinning Bypass konulu yazımda örnek olarak verdiğim tersine mühendislik ile SSL Pinning Bypass işlemine buradan erişip göz atabilirsiniz.

Kaynak :

https://link.springer.com/chapter/10.1007/978-3-642-04117-4_31

https://en.wikipedia.org/wiki/Reverse_engineering

https://en.wikipedia.org/wiki/Dynamic_program_analysis

https://radare.gitbooks.io/radare2book/basic_commands/write.html

https://www.cs.cmu.edu/~aldrich/courses/654-sp05/handouts/MSE-RevEng-05.pdf

Related Posts

Facebook Comments