Post

FridaLab Solution

My FridaLab Solution 01 ~ 08

Intro

์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ํ›„ํ‚น ํˆด์ธ Frida๋ฅผ ์ข€ ์ตํ˜€๋ณด๊ธฐ ์œ„ํ•ด FriaLab ์›Œ๊ฒŒ์ž„(?)์„ ํ’€์–ด๋ณด์•˜๋‹ค.

  • Android ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฒ„์ „: Android 13.0 (โ€œTiramisuโ€) | arm64
  • Frida Version: 16.7.14
  • Python 3.11.12

Frida Server 16.7.14 ๋ฒ„์ „์€ python 3.12 ๋ฒ„์ „ ์ด์ƒ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํŒŒ์ด์ฌ ๋ฒ„์ „์„ 3.11 ์ดํ•˜๋กœ
๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

Challenge 01


1
2
3
4
5
6
7
8
9
package uk.rossmarks.fridalab;

public class challenge_01 {
    static int chall01;

    public static int getChall01Int() {
        return chall01;
    }
}

Mainactivity์˜ onCreate๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด, getChall01Int์˜ ๋ฆฌํ„ด๊ฐ’์„ 1๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
setImmediate(function() {
    Java.perform(function(){
        var ClassChall01 = Java.use("uk.rossmarks.fridalab.challenge_01");
        ClassChall01.chall01.value = 1;
        console.log("[+] Challenge_01 Solved");
    })
})

challenge_01์˜ ๊ฒฝ์šฐ์—๋Š” ์ธ์Šคํ„ด์Šคํ™”๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— Java.use()๋กœ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ๊ฐ’์„ 1๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

Challenge 02


1
2
3
private void chall02() {
    this.completeArr[1] = 1;
}

MainActivityํด๋ž˜์Šค ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” method์ธ chall02()๋ฅผ ์‹คํ–‰๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
setImmediate(function() {
    Java.choose("uk.rossmarks.fridalab.MainActivity", {
        onMatch : function (instance) {
            instance.chall02();
        },
        onComplete : function () {
            console.log("[+] Challenge_02 Solved");
        }
    })
})

MainActivity๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž๋™์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ๋œ๋‹ค. ๊ทธ๋ž˜์„œ Java.choose()๋กœ MainActivity์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์™€ chall02()๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋œ๋‹ค.

Challenge 03


1
2
3
public boolean chall03() {
    return false;
}

MainActivityํด๋ž˜์Šค ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” method์ธ chall03()์˜ ๋ฆฌํ„ด๊ฐ’์„ true๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
setImmediate(function() {
    Java.choose("uk.rossmarks.fridalab.MainActivity", {
        onMatch : function (instance) {
            instance.chall03.implementation = function() {
                return true;
            }
        },
        onComplete : function () {
            console.log("[+] Challenge_03 Solved");
        }
    })
})

์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ chall03๋ฉ”์†Œ๋“œ๋ฅผ implementation๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์—ฌ ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ–ˆ๋‹ค.

Challenge 04


1
2
3
4
5
public void chall04(String str) {
    if (str.equals("frida")) {
        this.completeArr[3] = 1;
    }
}

MainActivityํด๋ž˜์Šค ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” method์ธ chall04()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ frida๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
setImmediate(function() {
    Java.choose("uk.rossmarks.fridalab.MainActivity", {
        onMatch : function (instnace) {
            instnace.chall04("frida");
        },
        onComplete : function () {
            console.log("[+] Challenge_04 Solved");
        }
    })
})

์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์™€ chall04๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ frida๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค.

Challenge 05


1
2
3
4
5
6
7
public void chall05(String str) {
    if (str.equals("frida")) {
        this.completeArr[4] = 1;
    } else {
        this.completeArr[4] = 0;
    }
}

4๋ฒˆ๋ฌธ์ œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค. onCreate์˜ onClick๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด Confirm ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ๋งˆ๋‹ค notfrida!๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋งค ์š”์ฒญ ๋•Œ ๋งˆ๋‹ค firda๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
setImmediate(function() {
    Java.perform(function() {
        let MainClass = Java.use('uk.rossmarks.fridalab.MainActivity');
        MainClass.chall05.implementation = function() {
            this.chall05("frida");
            console.log("[+] Challenge_05 Solved");
        }
    })
})

Java.choose๋กœ MainActivity์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์€ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์ค‘์— ๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋” ํด๋ฆญํ•˜๋ฉด notfrida!๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.
๋”ฐ๋ผ์„œ Java.use๋กœ MainActivity ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€ chall05 ์ž์ฒด๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์—ฌ, Frida ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” ํ•œ chall05("frida")๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Challenge 06


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package uk.rossmarks.fridalab;

public class challenge_06 {
    static int chall06;
    static long timeStart;

    public static void startTime() {
        timeStart = System.currentTimeMillis();
    }

    public static boolean confirmChall06(int i) {
        return i == chall06 && System.currentTimeMillis() > timeStart + 10000;
    }

    public static void addChall06(int i) {
        chall06 += i;
        if (chall06 > 9000) {
            chall06 = i;
        }
    }
}

confirmChall06์˜ ๋ฆฌํ„ด๊ฐ’์„ 1๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
// onCreate
challenge_06.startTime();
challenge_06.addChall06(new Random().nextInt(50) + 1);
new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        int nextInt = new Random().nextInt(50) + 1;
        challenge_06.addChall06(nextInt);
        Integer.toString(nextInt);
    }
}, 0L, 1000L);

onCreate์—์„œ ์œ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ด์™€ ํ•จ๊ป˜ ๋ฌธ์ œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž.

  1. startTime๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ์‹œ๊ฐ„์„ challenge_06ํด๋ž˜์Šค์˜ timeStart๋ณ€์ˆ˜์— ์ €์žฅ
  2. 10์ดˆ๋งˆ๋‹ค 0 ~ 50 ์‚ฌ์ด์˜ ์ •์ˆ˜๋ฅผ challenge_06ํด๋ž˜์Šค์˜ chall06๋ณ€์ˆ˜์— ๋”ํ•จ


๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ๋‘ ๊ฐœ์˜ ์กฐ๊ฑด์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

  • 10์ดˆ ํ›„ chall06์˜ ๊ฐ’์„ ๋งž์ถ˜๋‹ค.
  • confirmChall06์„ ์‹คํ–‰ํ•  ๋•Œ์˜ ์‹œ๊ฐ„์ด timeStart๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์‹œ๊ฐ„๋ณด๋‹ค 10์ดˆ ํ›„์—ฌ์•ผ ํ•œ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด setTimeout(function(){}, 10000)๋กœ 10์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ chall06๋ณ€์ˆ˜ ๊ฐ’์„ ํ›„ํ‚นํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๊ณผ timeStart๋ณ€์ˆ˜๋ฅผ ํ›„ํ‚นํ•ด ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋ณด๊ฒ ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setImmediate(function(){
    Java.perform(function(){
        Java.choose("uk.rossmarks.fridalab.MainActivity", {
            onMatch : function(instnace){
                let ClassChall06 = Java.use("uk.rossmarks.fridalab.challenge_06")
                ClassChall06.timeStart.value = -10000
                ClassChall06.addChall06.implementation = function(i) {
                    this.addChall06(i);
                }
                instnace.chall06(Number(ClassChall06.chall06.value));
            },
            onComplete : function(){
                console.log("[+] Challenge_06 Solved");
            }
        })
    })
});

Challenge 07


1
2
3
4
5
6
7
8
9
10
11
12
13
package uk.rossmarks.fridalab;

public class challenge_07 {
    static String chall07;

    public static void setChall07() {
        chall07 = BuildConfig.FLAVOR + (((int) (Math.random() * 9000.0d)) + 1000);
    }

    public static boolean check07Pin(String str) {
        return str.equals(chall07);
    }
}

chall07์˜ ๊ฐ’์„ ๋งž์ถฐ์•ผ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ๋‹ค. BuildConfig.FLAVOR๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๊ธฐ์— ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†๊ณ , (((int) (Math.random() * 9000.0d)) + 1000);์˜ ๊ฐ’์€ 1000 ~ 9999 ์‚ฌ์ด์˜ ๊ฐ’์ด๋‹ˆ ๋ธŒ๋ฃจํŠธํฌ์‹ฑํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์ž.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setImmediate(function() {
    Java.perform(function() {
        Java.choose("uk.rossmarks.fridalab.MainActivity", {
            onMatch: function (instance){
                let ClassChall07 = Java.use("uk.rossmarks.fridalab.challenge_07")
                for (let i=1000; i<=9999; i++){
                    if(ClassChall07.check07Pin(i.toString())){
                        instance.chall07(String(i));
                        console.log("[+] Challenge_07 Solved : " + i);
                        break;
                    }
                }
            },
            onComplete : function(){}
        })
    })
})

๋ธŒ๋ฃจํŠธํฌ์‹ฑํ•˜์—ฌ ์•Œ๋งž์€ ๊ฐ’์„ ํ™•์ธํ•œ ํ›„ chall07์„ ๊ทธ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ–ˆ๋‹ค.

Challenge 08


1
2
3
public boolean chall08() {
    return ((String) ((Button) findViewById(R.id.check)).getText()).equals("Confirm");
}

๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋‹ค. ํ˜„์žฌ ํ™•์ธ๋ฒ„ํŠผ ์ด๋ฆ„์ธ Check๋ฅผ Confirm์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setImmediate(function() {
    Java.perform(function() {
        Java.choose("uk.rossmarks.fridalab.MainActivity", {
            onMatch: function (instance){
               let button = Java.use("android.widget.Button")
			   // public static final int check = 0x7f07002f;
               let check = instance.findViewById(0x7f07002f)
               let checkButton = Java.cast(check, button)
               let String = Java.use("java.lang.String")
               checkButton.setText(String.$new("Confirm"))
            },
            onComplete : function(){
                console.log("[+] Challenge_08 Solved");
            }
        })
    })
})

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Check ๋ฒ„ํŠผ์ด Confirm ๋ฒ„ํŠผ์œผ๋กœ ๋ฐ”๋€๋‹ค.


All Solved

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. FridaLab์€ Frdia ํˆด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ ์ธ ๋ฌธ์ œ์ด๊ธฐ์— ๋‹ค๋ฅธ ์›Œ๊ฒŒ์ž„๋“ค์„ ํ’€์–ด๋ณด๊ณ  ๋‹ค์–‘ํ•œ APK๋ฅผ ๋ถ„์„ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

FridaLabCapture FridaLabAllSolved
This post is licensed under CC BY 4.0 by the author.