Seviye 1 Soru 11



Uygulama IDA Pro ile açılıp incelendiğinde, derleyiciye (compiler) ait birçok komutun varlığı görülmektedir. Derleyiciler tarafından eklenen komut parçaları programın ana işlevini değiştirmeden çeşitli kontrolleri yapmaktadır. Şekil 1’de derleyici komutlarının bittiği ve uygulamanın kendisine ait komutların çalıştırılacağı adres gösterilmektedir.


Şekil 1- Uygulamaya Ait Komutların Başlangıç Adresi

0x401000 adresinden itibaren inceleme işlemine devam edilirse, uygulamada hata ayıklayıcı tespit ve engelleme teknikleri (anti debugging) kullanıldığı görülmektedir. İlgili teknikler Şekil 2’de gösterilmektedir.



Şekil 2-Hata Ayıklayıcı Tespit ve Engelleme Teknikleri

IsDebuggerPresent, ilgili uygulamanın hata ayıklayıcı altında çalıştığını tespit eden bir API fonksiyonudur. Bu fonksiyonu bypass etmek için, uygulama OllyDbg ile açılmalı ve IsDebuggerPresent fonksiyonunun çağırıldığı adrese ( 0x40109c) breakpoint koyulmalıdır. Şekil 3’te bu adım gösterilmektedir.

Şekil 3- IsDebuggerPresent Fonksiyonu

Bu fonksiyon temelde (FS:[30] + 2) adresindeki byte değerini kontrol etmektedir. Bu adresteki byte, hata ayıklayıcı varlığında 1 değerini almaktadır. IsDebuggerPresent fonksiyonu çağırıldıktan sonra, ortamda hata ayıklayıcı varsa EAX registerinin değeri 1 olmaktadır (Ortamda hata ayıklayıcı yoksa bu değer 0 olmaktadır).
Uygulama debug edilirken rastlanılan IsDebuggerPresent fonksiyonları tek tek çalıştırılıp eax registerının içeriği her defasında 0’a eşitlenebileceği gibi daha genel bir yöntem de mevcuttur. Bu yazıda ikinci yöntem anlatılmaktadır.
Uygulama içerisinde birden fazla noktada bu fonksiyonun kullanılabileceği ihtimalini düşünerek FS:[30] + 2 adresindeki byte değerini 0 yapıyoruz.
Bunun için dump bölmesine tıklayarak Ctrl+G tuşlarına bastıktan sonra gelen pencereye FS:[30]+2 değeri yazılmalı ve ardından enter tuşuna basılmalıdır. Şekil 4’te bu adım gösterilmektedir.

Şekil 4-Dump Bölmesinde Bellek Değerini Değiştirme

Ardından Dump bölmesindeki adres değeri bizim istediğimiz byte üzerine gelmiş olacaktır. Bu byte üzerine tıklandıktan sonra Şekil 5’teki işlem yapılarak ilgili değer 0 olarak atanmalıdır.

Şekil 5-Dump Bölmesinde Bellek Değerini Değiştirme 2

Bu noktadan sonra uygulama içerisinde kullanılan IsDebuggerPresent fonksiyonları ortamdaki hata ayıklayıcı varlığını tespit edemeyecektir.
Uygulamada kullanılan diğer engelleme tekniği ise SetUnhandledExceptionFilter fonksiyonudur. SetUnhandledExceptionFilter kullanılarak uygulamada oluşacak kural dışı durumların belirli fonksiyonlar tarafından işlenmesi sağlanmaktadır. Bu fonksiyonun kullanıldığı adres Şekil 2’de gösterilmektedir.
Bu fonksiyon parametre olarak kural dışı durumları işleyecek olan fonksiyonun adresini almaktadır. Uygulama tarafından ilgili fonksiyon çalıştırıldıktan hemen sonra, kasıtlı olarak kural dışı durum oluşturmak amacıyla 0’a bölme işlemi yapılmaktadır (division by zero). Şekil 6’da ilgili kısım gösterilmektedir.



Şekil 6- Kasıtlı Olarak Sıfır'a Bölme İşlemi


Sıfıra bölme işleminden sonra uygulama daha önce atadığı kural dışı durum filtreleyici fonksiyonu çalıştırmaktadır.
Uygulama hata ayıklayıcı altında çalıştırılıyorsa, hata ayıklayıcı kural dışı durum işleyici olarak davranacağından uygulamanın çalışması sonra ermektedir. Bu yazıda kullanılan OllyDbg programı çeşitli Anti-debug bypass pluginlerini barındırdığından dolayı uygulama çalışmasına devam etmiştir. Şekil 7’de kural dışı durum işleyici fonksiyona ait komutlar gösterilmektedir.


Şekil 7- Kural Dışı Durum Filtreleyici Fonksiyon

Bu fonksiyonda kullanılan XOR işlemi ile ileride sunucudan alınacak şifreli mesajların çözümlemesinde kullanılacak anahtar üretilmektedir.
Anahtar oluşturulduktan sonra uygulama Şekil 8 ve Şekil9’da gösterildiği gibi Twitter’a GET talebi yapmaktadır.

Şekil 8-Twitter'a GET Talebi

Uygulama tarafından Twitter’a yapılan GET talebinin içeriği Şekil 9’da gösterilmektedir.

Şekil 9-Twitter'a GET Talebi 2

Twitter’a GET talebi yapıldıktan sonra, sunucudan dönen mesajın belirli formatta olması beklenmektedir. Şekil 10’da sunucudan dönen mesajın formatı kontrol edilmektedir.


Şekil 10-Twitter'dan Gelen Cevabın Kontrolü

Görüldüğü gibi gelecek olan cevabın MSJ_ harfleri ile başlaması ve _SON ile bitmesi gerekmektedir. Bu formata uymayan mesajlar uygulama tarafından işleme alınmamaktadır.
Bir sonraki adımda sunucudan alınan şifreli mesajın çözülmesi gerçekleştirilecektir. Şekil 11’de ilgili adım gösterilmektedir.

Şekil 11-Mesajın Uygun Formata Çevrilmesi

Şekil 11’de sunucudan alınan mesaj başlık ve kuyruk bilgilerinden ayrıldıktan sonra çözülmek için belleğe kopyalanmaktadır.
Bir sonraki adımda ise şifreli mesaj çözülmekte ve mesajın açık hali elde edilmektedir. Eğer mesaj içerisinde “Erler” kelimesi geçiyorsa uygulama tarafından pop-up pencere oluşturularak kullanıcı bilgilendirilmektedir. Şekil 12’de bu adım gösterilmektedir.


Şekil 12- Şifreli Mesajın Çözülmesi Ve Açık Halinin Kontrolü

Soruda bizden istenen ise, Twitter’da bulunan diğer şifreli mesaj ve bu mesajın açık halinin tespit edilmesidir.
Önceki adımlarda uygulama tarafından kabul edilen şifreli mesajların formatı belirtilmiştir (MSJ_ ile başlayıp _SON ile bitmesi). Twitter üzerinde bu şartlara uyan diğer mesaj Şekil 13’te gösterilmektedir.

Şekil 13- Şifreli Mesaj

Şifreli mesaja ait URL Şekil 14’te gösterilmektedir.

Şekil 14-Şifreli Mesaja Ait URL

Şifreli mesaj ve URL tespit edildikten sonra uygulama tekrar debug edilerek Şekil 8’de gösterilmiş olan GET talebinin yapıldığı adrese breakpoint koyulmalı ve bu adrese gelinmelidir. Daha sonra uygulama tarafından yapılan GET talebinin içeriği Şekil 14’te belirtilen URL olacak şekilde değiştirilmelidir. Şekil 15’te ilgili adım gösterilmektedir.

Şekil 15-GET Talebinin Değiştirilmesi

Bu adımdan sonra, sunucuya GET talebi yapılacak ve sunucudan alınan şifreli mesaj çözülerek Şekil 12’de belirtildiği gibi 0x40118F adresinde mesajın açık halinin “Erler” kelimesini içerip içermediği kontrol edilecektir.
Şekil 15’teki adım tamamlandıktan sonra  0x40118F adresine breakpoint koyulmalı ve uygulama çalışmaya devam ettirilmelidir. Uygulama Şekil 16’daki gibi 0x40118F adresinde durduktan sonra şifreli mesajın açık hali eax registeri içerisinden okunacaktır.


Şekil 16-Kontrol Fonksiyonu

 Şekil 17’de mesajın açık hali gösterilmektedir.

Şekil 17-Mesajın Açık Hali