CTFZone 2018 Android_ololo_country_checker
Points : 314 , 8 takım çözdü
Sorunun açıklaması :
It's a foreign android application. Let's try to guess the country! |
Ve bir apk verildi. ololo.apk
Apkdaki dosyalarımız :
APKyı jadx ile açtığımda, jadx’in classları düzgün decompile edemediğini gördüm. Hazır açmışken native kütüphane var mı diye baktım ve lib/armeabi-v7a altında libnative-lib.so dosyasını gördüm. Şimdii normalde android emulatoru olarak genymotion kullanmaktaydım. Ancak bu native so dosyasını apk’nın çalıştırabilmesi için arm tabanlı bir imaj kullanmam gerek, genymotionda arm sistem ayağa kaldırmak malesef mümkün değil. O yüzden paşa paşa android studioyu kurup armeabi-v7a lı bir imaj kurmamız gerekiyor. Ve apkmızın MainActivity’sindeki
if (System.getProperty("os.arch").equalsIgnoreCase("armeabi-v7a")) { |
şu if’i kaldırmamız gerekiyor. Kaldırmazsak so dosyasını yükleyemiyor . Bu işlem için önce apktool d ololo.apk
ile decompile edip ilgili yeri silin (bu sefer size bırakıyorum) ve apktool b ololo.apk
ile build edin. Sign ettikten sonra apkyı telefona yükleyin.Uygulamayı açtığımızda karşımıza aşağıdaki ekran geliyor. Check’e bastığınızda crash almıyorsanız if kısmını doğru yapmışsınız demektir. Her checke basıldığında resim ve alttaki stringler değişiyor.
Java classlarını decompile edebilmek için önce apk’yı zip’e çevirdim ve içinden classes.dex’i çıkardım. Ardından bu dex dosyasını https://github.com/pxb1988/dex2jar/releases ile jar’a çevirdim. Jar dosyasını http://www.benf.org/other/cfr/ aracı ile java hale getirdim.
java -jar cfr_0_132.jar classes-dex2jar.jar > main.java |
main.java dosyasını incelemeye koyuldum. Çok güzel anti-debugging methodları bulunmaktaydı. Genel olarak aaa.aie.* classlarının ilk methodu get, ikincisi de gelen parametre ile bu get’in karşılaştırılması idi.
package aaa.aie; |
- aaa.aie.eka.ega -> getSDKVersion
- aaa.aie.eka.egn -> getPackageName // uygulamanın adı
- aaa.aie.ekd.egdi -> getDeviceId
- aaa.aie.eki.egsi -> getSubscriberId
- aaa.aie.ekl.egsci -> getSimCountryIso
- aaa.aie.ekpn.egln -> getLine1Number
ololo.ololo.ololo.MainActivity.getSoBody methodu res/raw altındaki resimleri alıp işleme tabi tutmaktaydı. Daha fazla işlem göremeyince asıl işin so dosyasında yapıldığını düşünüp native dosyamıza dalmaya karar verdim.
libnative-lib.so dosyamızı IDAPro’da açtım. 2 fonksiyonumuz dışında hiçbir fonksiyonun ismi hoş gözükmüyordu.
O iki fonksiyonun isminin öyle olmasının nedeni apkımızın MainActivity sinde çağırılmaları. Bu fonksiyonları incelemeye koyuldum. Öncelikle sorunun ismiyle alakalı olduğu için Java_ololo_ololo_ololo_MainActivity_checkSomethings
ile başladım. Fonksiyonumuz yaklaşık 90 tane variable tanımladıktan sonra 4 adet fonksiyon çağırmakta
Bu 4 fonksiyonun birine gittiğimde gözüme hemen paket isimleri ilişti
Tam olarak emin olmasamda aaa.aie.ekl.egsci
‘yi çağırıp dönen değeri dword_9ABC’ye atadığı sonucuna vardım. Değişkeni ve fonksiyonun adını ilgili method ne yapıyorsa ona göre adlandırdım. Bu örnek için fonksiyon ismi -> getSimCountryIso ve dword_9ABC -> strSimCountryIso
4 fonksiyonda da bu şekilde isimlendirme yaptım.
j_ ile başlayan fonksiyonlarda çok fazla işlem vardı. string değerleri sırayla bu 3 fonksiyona tabi tutuluyordu. Belkii md5 ?? .. Bi ihtimal diyip v84’e md5(strSubscriberId) diyip yoluma devam ettim. Açıkcası burdan sonra biraz tahmin biraz atma tutma oldu diyebilirim. Kafamdaki senaryo cihazdan topladığı bilgilerin md5ini alıp karşılaştırıyor eğer uyuyorsa bize flagi veriyor.
Bu byte**** değişkenlerindeki değerlere bakarsak;
online araçlarla hepsinin karşılığını buluyoruz.
phone = 8203412(03bec67d849e7114f1a828e1628495fe)/7793952(c377ec2ae9bc906448b6c39326e42f04) |
Evet tahminlerim doğru gibi. Daha fazla arm’da boğulmadan bu değerleri döndürecek bir frida scripti yazıp denemek lazım. Eğer daha önce frida kurmadıysanız kısaca özetlersek
pip install frida
ile client’a frida kuruyoruz.
https://github.com/frida/frida/releases
dan telefona veya emulatore uygun son surum server’ı indirip adb push frida-dosyaismi /data/local/tmp
ile pushluyoruz. chmod +x frida-dosyaismi
./frida-dosyaismi
ile serverı başlatıyoruz.
Ardından clientta frida-ps -U
dersek telefonda çalışan uygulamaları görebiliriz.
Instrumentation yapıcağımız uygulamayı listeden kopyalayıp frida -U ololo.ololo.ololo -l script.js
diyerek scriptimizi load edebiliyoruz.
Frida scriptimiz çok basit.
- aaa.aie.eka.ega -> getSDKVersion
- aaa.aie.eka.egn -> getPackageName // uygulamanın adı
- aaa.aie.ekd.egdi -> getDeviceId
- aaa.aie.eki.egsi -> getSubscriberId
- aaa.aie.ekl.egsci -> getSimCountryIso
- aaa.aie.ekpn.egln -> getLine1Number
şu fonksiyonlara md5’ini bulduğumuz değerleri döndüreceğiz.
Java.perform(function () { |
Vee FLAG : ctfzone{1t_1s_0l0l0_g00d_4tt6mpt}