Tersine Mühendisliğe Giriş ve CrackMe

Mirac Celikates
Turk Telekom Bulut Teknolojileri
6 min readJul 24, 2023

Reverse Engineering

Merhabalar. Bugünkü yazımda tersine mühendisliğin kullanımını giriş seviyesinde paylaşacağım. Sonrasında ise basit bir CrackMe ile öğrendiklerimizi pekiştireceğiz. İlerleyen süreçte ise daha da derinlemesine ve örneklendirilmiş şekilde yazılarım devam edecek.
Bu yazıların tamamı eğitim amaçlı olmakla birlikte herhangi bir korsan ya da hileye teşvik edilmemekte ve sorumluluk kabul edilmemektedir.

Tersine mühendislik, bir çıktının ya da ürünün yapım aşamalarını anlamak, temel ürünlerini işlevlerini ve değerlerini öğrenmek ve nasıl yapıldığını kavramak için ilerlenen çözüm ve analiz sürecidir. Tersine mühendisliğin temel amacı bunlar olsa da öne çıkan teknolojiyi kopyalamak ve benzer ürün ortaya koymak için de kullanılmaktadır. Ayrıca tersine mühendislik sayesinde, sıfırdan bir ürün yerine halihazırda bir üründen yola çıkılmasından kaynaklı zaman ve maliyet alanlarında yüksek verimi bulunmaktadır.

Tersine mühendisliğin gelişmesini ve öne çıkmasını sağlayan ise, diğer mühendisliklerde olduğu gibi savaşlardır. En aktif kullanılan süreçler ise İkinci Dünya Savaşı ve Soğuk Savaş sürecidir. Bu zaman aralığında düşman ülkenin teknolojilerini, aletlerini ve bilgilerini kendi lehine kullanabilmek için birçok tersine mühendislik çalışmaları yapılmıştır. Örneğin İkinci Dünya Savaşında yüksek etkili bombardımanlarıyla, Japonya’ya atılan nükleer bombaları taşımasıyla ile dünya çapında ses getiren ve Uçan Kale ismiyle ünlenen yüksek irtifa stratejik bombardıman uçağı Amerikan Boeing B-29 Superfortress Sovyetler Birliği tarafından ele geçirlimiştir. Bu alanda büyük bir mühendislik bilgisi eksiği olan Sovyetler Birliği tersine mühendisliği kullanarak Tupolev Tu-4 uçağı geliştirilmiştir. Böylece Sovyetler Birliği bu alandaki eksiğini, yüksek benzerliğe sahip Tupolev Tu-4 üreterek kapatmıştır.

https://www.airway.com.br/coincidencia-ou-espionagem-avioes-sovieticos-copiados-ocidente-guerra-fria/clone-b-29/

Benzer şekilde Alman V2 roketleri, savaş sonrası ele geçirilen mühendisler ve tersine mühendisliği aracılığıyla Sovyetler Birliği’nin uzay çalışmalarının temelini oluşturmuştur.

YAZILIMDA TERSİNE MÜHENDİSLİK

Yazılımda ise halihazırda derlenmiş ve binary düzeyde bilgisayar tarafından okunan kod ve kod türleri, insan tarafından okunabilecek bir şekilde getirilir. Bu aşamada kaynak kodlarına erişilmesi istenilen bir yazılım ürününde ilk yapılması gereken çalışma mantığını kavranmasıdır. İşlevlerin nasıl bir kodlama aracılığıyla gerçekleştiği hakkında akıl yürütülür ve denemeler yapılır. Sonrasında bu kodlamanın işlevini yerine getirilecek kodlar tespit edilebilir ya da yeniden oluşturulabilir.

Bunlara ek olarak yazılım geliştiriciler kodlamadaki belirlenmiş kısımların, yazılımdaki rolünü ve işlemleri nasıl gerçekleştirdiğini tespit ederek kodda düzeltmeler, hata gidermeler ve daha stabil hale getirmek için çalışmalar yapabilir. Siber güvenlik uzmanları yazılımın daha güvenli olması için de kullanabilmektedir.

Bildiğiniz gibi insanlar tarafından farklı diller yazılan kodlar (C, Python, Java vb.) CPU tarafından anlaşılabilecek formata dönüştürülmektedir. Assembly dili, bir bilgisayarın makine diline yakın olan, insan tarafından anlaşılabilir bir düşük seviye programlama dillerinden biridir. Bu dil, tersine mühendislik çalışmalarında sıklıkla kullanılır çünkü doğrudan bellek ve işlemci kaynaklarını kontrol etmemizi sağlar. Bu yazımda, Assembly dilinin tersine mühendislikte nasıl kullanıldığını anlatacağım.

Şimdi aşağıda sizlere C dili üzerinden basit bir Hello World kodunu ve sonrasında bunun Assembly Code şeklinde çıktısını göstereceğim:

#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
.LC0:
.string "Hello, World!"
main:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov eax, 0
pop rbp
ret

Farklı ve karmaşık mı geliyor? İnanın bana bununla biraz zaman geçirdikten ve işler karmaşıklaştıktan sonra bulmaca çözmekten çok daha keyifli oluyor.

Assembly Nedir?

Assembly dili, bir bilgisayarın işlemcisini doğrudan kontrol etmek için kullanılan bir düşük seviye programlama dilidir. Her bir işlemcinin kendine özgü bir assembly dili vardır. Assembly dilinde, işlemcinin komut seti doğrudan kullanılır ve her bir komut, işlemcinin makine dilindeki bir karşılığını temsil eder. Bu dil, bellek adreslemesi, işlemciler arası iletişim ve hesaplama gibi düşük seviye işlemleri gerçekleştirmek için kullanılır. Tersine mühendislikte, assembly dili, bir programın veya donanım bileşeninin işleyişini anlamak için kullanılan bir araçtır.

Bu gördüğünüz x86–64, amd64, gibi isimlerle görebileceğiniz 64-bit Complex Instruction Set Computing (Karmaşık Komut Kümesi Hesaplama) (CISC) mimarisi olarak geçmektedir. Çok boytlu kayıt erişimi, bellek erişimi kayıt okuma vb. işlemleri gerçekleştirebilmektedir. Hafızaya kaydedilen verilere böylece erişebilmekteyiz.

Kullanımı

Üstteki örnekte bulunduğu gibi Assembly dilinin kendine özgü komutları bulunmaktadır.
Örneğin:

ADD A, X : X’teki saklayıcı değeri A değerine eklemektedir.
INC A : A değerini 1 arttırmaktadır.
DEC A : A değerini 1 azaltmaktadır.
DIV AB : A değeri B değerine bölünmektedir. Bölüm değeri A’ya kalan ise B’ye yüklenir.
CLR A : A değeri temizlenir.

Örnekler:
1)
MOV AX, 5 ; AX = 5
MOV BX, 3 ; BX = 3
ADD AX, BX ; AX = AX + BX
Bu kod, AX ve BX registerlarını kullanarak iki sayının toplamını hesaplar. İlk iki satır, değerleri AX ve BX registerlarına kopyalar. Üçüncü satırda ise, AX registerındaki değere BX registerındaki değeri ekler.

2)
MOV AX, 10 ; AX = 10
MOV BX, 4 ; BX = 4
SUB AX, BX ; AX = AX — BX
Bu kod, AX ve BX registerlarını kullanarak iki sayının farkını hesaplar. İlk iki satır, değerleri AX ve BX registerlarına kopyalar. Üçüncü satırda ise, AX registerındaki değerden BX registerındaki değeri çıkarır.

3)
MOV AX, 5 ; AX = 5
CMP AX, 10 ; AX ile 10'u karşılaştır
JG label1 ; AX 10'dan büyükse ‘label1’ adlı etikete atla
JL label2 ; AX 10'dan küçükse ‘label2’ adlı etikete atla
JE label3 ; AX 10'a eşitse ‘label3’ adlı etikete atla
Bu kod, AX registerındaki değeri 10 ile karşılaştırır ve buna göre farklı işlemler yapar. CMP komutu, AX registerındaki değeri 10 ile karşılaştırır. Ardından, JG (jump if greater), JL (jump if less) ve JE (jump if equal) komutları, AX registerının belirli bir koşulu karşılaması durumunda belirtilen etikete atlama işlemini gerçekleştirir.

CrackMe

Şimdi ise giriş seviyesinde bir CrackMe ile Assembly üzerinden öğrendiklerimizi pekiştireceğiz.

Bu CrackMe dosyasında bize bir .exe dosyası verilmekte lakin herhangi bir şifre ve kullanıcı adına sahip değiliz. Rastgele değerleri girdiğimizde ise karşımıza şu şekilde bir ekran çıkmakta.

Bu ekran hata ekranı gibi gözükse de bizim için fazlasıyla yol gösterici olacaktır. Hadi şimdi kedinin fareyle oynadığı gibi bu yazılımla oynayalım.

İlk olarak yazılımın hangi mimaride yazıldığına ve nasıl hünerlere sahip olduğuna bakmamız gerekiyor. Bunun için die adlı uygulamayı kullanıyorum.

Burada görebileceğiniz gibi 32 bit mimariye sahip. Bu sebepten dolayı x32 debugger yazılımını kullanacağım.

Karşınızda yazılımın assembly karşılığı.

Şimdi biz bu yazılımı nasıl geçeceğiz? Hepsini teker teker bakmak zaman ve emek kaybı. Burada ilk olarak karşımıza çıkan hata ekrandaki Bad Boy uyarısını ‘Bad Boy’ string değerini arayarak araştırıyoruz.

Gördüğünüzü gibi burada hata ekranındaki ‘Bad boy…’ ve açıklama metnini görebilirsiniz. Hemen üstünde de doğru olduğunu anladığımız metinler bulunmakta. Peki buraya nasıl geçebiliriz? Bad boy yazısına yönlendiren bir bölüm olmalı. Evet bu tam olarak jne crackme olarak başlayan kısım. Eğer doğru değer girilmezse okla gösterdiğim kısma yönlendiriyor ve hata alıyoruz. Burayı düzenleyerek ne olursa olsun doğru değere yönlendirebiliriz. Bu sebeple bu kısımdaki değeri resimdeki gibi, istenilen hafıza değerinin bilgisini vererek değiştiriyorum.

Sonrasında ise bu değiştirilmiş dosyayı farklı bir .exe olarak kaydediyorum ve hata aldığım değerlerin aynısını yeni dosyama giriyorum.

İşte ilk adımımızı böyle tamamlamış oluyoruz. İlerideki yazılarımda daha da zorlu çalışmaları sizlere göstermek istiyorum. Zaman ayırdığınız için çok teşekkürler.

Ayrıca Assembly üzerine yapmak istediğiniz çalışmaları hiçbir indirme gerektirmeksizin ücretsiz tarayıcı üzerinden Bulutbilisimciler sitesinden deneyebilirsiniz.

--

--