alpertunga
Üye
owasp-mastg/Crackmes/Android/Level_01/UnCrackable-Level1.apk at master · OWASP/owasp-mastg
The Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes the technical processes for verifying the contr...
Kod:
adb install UnCrackable-Level1.apk

Cihazımız rootluydu ve program bunu farkedip bize bir uyarı çıkardı. OK butonuna bastığımız zaman kendini kapatacak. Yani ilk halletmemiz gereken kısım bu
root detect
fonksiyonu olacak. Bunun için ben jadx
ile açıp inceleyeceğim.AndroidManifest.xml

sg.vantagepoint.uncrackable1.MainActivity

sg.vantagepoint.a.c

Cihazımızın nasıl root olduğunu tespit ettiğine dair yapı şu şekilde kısaca. Burada isterseniz tek tek frida ile 3 fonksiyonun false dönmesini sağlayabilir, isterseniz gene frida ile System.exit() fonksiyonunu manipüle edebilir veya smali kodu içerisindeki bu if bloğunu / fonksiyonu silip tekrar paketleyebilirsiniz.
1. Yöntem
Kod:
Java.perform(function() {
console.log("[+]Root detect bypass !");
var detect = Java.use("sg.vantagepoint.a.c");
detect.a.implementation = function() {
console.log("a() return false");
return false;
};
detect.b.implementation = function() {
console.log("b() return false");
return false;
};
detect.c.implementation = function() {
console.log("c() return false");
return false();
};
});
Kod:
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause

2. Yöntem
Kod:
Java.perform(function() {
console.log("[+]Root detect bypass !");
var detect = Java.use("java.lang.System");
detect.exit.implementation = function() {
console.log("system.exit nerdesin ?");
};
});
Kod:
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause

Karşımıza gene
root detected!
yazısı gelecek. Ancak OK
butonuna bastıktan sonra çıkış işlemi çalışmayacaktır.3. Yöntem

apktool ile apk dosyasını açtıktan sonra (apktool d UnCrackable-Level1.apk) şu dizine gidelim
UnCrackable-Level1/smali/sg/vantagepoint/uncrackable1
. Bu dizinde bulunan 'MainActivity$1.smali'
dosyasında yukarda jadx ile görmüş olduğumuz satır yer almakta.
Burda bulunan
const/4 pl1, 0x0 invoke-static {p1}, Ljava/lang/System;->exit(I)V
kod parçasından kurtulup tekrardan paketlersek eğer programın çıkış yapmasını engellemiş oluruz.
Kod:
$ apktool b UnCrackable-Level1 -o UnCrackable-Level1_edited.apk
$ keytool -genkey -v -keystore ctf.keystore -alias ctfKeystore -keyalg RSA -keysize 2048 -validity 10000
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ctf.keystore UnCrackable-Level1_edited.apk ctfKeystore
$ jarsigner -verify -verbose -certs UnCrackable-Level1_edited.apk
$ adb uninstall owasp.mstg.uncrackable1
$ adb install UnCrackable-Level1_edited.apk

Eğer soruyu böyle çözmek isterseniz
a.smali
içerisine de şu satırları ekleyip paketlerseniz eğer programı çalıştırdıktan sonra loglardan istenilen şeyi öğrenebilirmişsiniz.Ben frida ile devam edeceğim…
NOT: Bu yöntemler dışında farklı yöntemler kullanarak da root kontrolünü atlatabilirsiniz.
Frida Devam
Bizden istenilen değeri bulalım…sg.vantagepoint.uncrackable1.MainActivity

sg.vantagepoint.uncrackable1.a

sg.vantagepoint.a.a

Evet gördüğümüz üzere AES kullanılmış. Bu fonksiyondan dönen değer bizim girmiş olduğumuz değer ile karşılaştırılıyor. O halde bu fonksiyonu hooklayıp return ettiği değeri ekrana yazdırırsak aradığımızı bulmuş oluruz.
Not: Burda dikkat etmemiz gereken şey dönen değer string tipinde değil gibi o yüzden ufak bi dönüşüme ihtiyacımız olacak.
Kod:
Java.perform(function() {
console.log("[+]Root detect bypass !");
var detect = Java.use("java.lang.System");
detect.exit.implementation = function() {
console.log("system.exit nerdesin ?");
};
var encrypt = Java.use("sg.vantagepoint.a.a");
encrypt.a.implementation = function(var0, var1) {
var ret = this.a(var0, var1);
var flag = '';
for(var i = 0; i < ret.length; i++) {
flag += String.fromCharCode(ret[i]);
}
console.log("[+] Decrypted : " + flag);
return ret;
};
});

Bizden istenen değer
I want to believe
sanırım. Hemen deneyelim.
Ve evet bu şekilde bizden isteneni bulmuş olduk