Türkçe

Hackzeugma CTF 2020 yarı finallerinde çözdüğüm Potter sorusunun çözümünü anlatacağım.

Bize bir apk verilmişti. potter.apk Bu apk’yi yükleyip çalıştırıp butona tıkladığımızda bir textbox’a flag’ı yazıyordu.



Ama tamamının yazılmasını beklemek asırlar sürerdi herhalde.
Apk’yı jadx-gui ile açıp MainActivity’nin içindeki a inner classına ait run methoduna baktığımızda


public void run() {
    for (int i = 4; i < MainActivity.this.p.length + 4; i++) {
        for (int j = 0; j < 11; j++) {
            try {
                Thread.sleep(MainActivity.this.r * ((long) i));
                this.b.setCharAt(i, (char) (new Random().nextInt(26) + 97));
                MainActivity.this.runOnUiThread(new C0033a());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        StringBuilder sb = this.b;
        MainActivity mainActivity = MainActivity.this;
        sb.setCharAt(i, mainActivity.getChar(mainActivity.p[i - 4]).charAt(0));
        try {
            Thread.sleep(MainActivity.this.r);
            MainActivity mainActivity2 = MainActivity.this;
            double pow = Math.pow(3.0d, (double) (i - 4));
            double d = (double) MainActivity.this.r;
            Double.isNaN(d);
            mainActivity2.r = (long) (pow * d);
        } catch (InterruptedException e2) {
            e2.printStackTrace();
        }
        MainActivity.this.runOnUiThread(new b());
    }
    }


Thread.sleep(MainActivity.this.r * ((long) i));

ve


Thread.sleep(MainActivity.this.r);

satırlarından anlaşılacağı üzere eğer r yi 0 yaparsak, hiç beklemeyecekti.
Ayrıca r, oluşturulurken 100 e eşitlenmişti


public class MainActivity extends c {
    ....
    public long r = 100;
    ...

veeee


double d = (double) MainActivity.this.r;
...
mainActivity2.r = (long) (pow * d);

satırlarında d‘yi r‘ye eşitleyip pow değişkenini d ile çarptığından, eğer r yi lol fonskiyonu çağrıldığında 0 yaparsak, r hep 0 kalacaktı.
frida-server’i çalıştırıp potter.js


Java.perform(function() {
	var main_activity= Java.use("com.hz.potter.MainActivity");
	main_activity.lol.implementation = function(var_0) {
        console.log(this.r.value);
        this.r.value=0;
        console.log(this.r.value);
        this.lol(var_0);
	}
});

dosyasını


frida -f com.hz.potter -l potter.js –no-pause


ile gönderip butona tıkladığımızda flag anında karşımıza çıkıyordu