OWASP UnCrackable Android App Level 1 Writeup

adb install UnCrackable-Level1.apk

Uygulamamızı kurduktan sonra açalım bakalım bizi ne karşılayacak (Android 4.4 üstü olması tavsiye ediliyor. Ben android 7 sürümü üzerinde anlatacağım)

0

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

1

sg.vantagepoint.uncrackable1.MainActivity

2

sg.vantagepoint.a.c

3

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
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();
	};
});
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause

4

2. Yöntem
Java.perform(function() {
	console.log("[+]Root detect bypass !");

	var detect = Java.use("java.lang.System");

	detect.exit.implementation = function() {
		console.log("system.exit nerdesin ?");
	};
});
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause

5

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

3. Yöntem

6

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.

7

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.

$ 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

8

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

9

sg.vantagepoint.uncrackable1.a

10

sg.vantagepoint.a.a

11

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.

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;
	};
});

12

Bizden istenen değer I want to believe sanırım. Hemen deneyelim.

13

Ve evet bu şekilde bizden isteneni bulmuş olduk :)

Kaynaklar

3 Beğeni