반응형

 

clicker.apk
0.23MB

 

문제 화면은 다음과 같음. 할 수 있는 동작은 클릭으로 숫자를 높여가는 것이므로, 천만번 클릭하면 플래그 획득할 수 있는 것으로 보임

 

jadx로 decompile하여 onClick이나 onTouchevent 메서드를 찾아봄

화면을 터치하면 this.g값이 1씩 증가하게 되고, this.g값이 3769, 10007, 59239, 100003, 495221, 1000003, 9999999과 일치하게 되면 브로드캐스트 메시지를 송신하게 됨. obtain() 메서드의 경우 핸들러와 관련있다고 하나, 문제 풀이와는 크게 관려 없어 보이므로 패스

 

처음에는 단순히 onTouchEvent를 Frida로 후킹하여 1000만번 클릭하게 구성

Java.perform(function () {
    // Function to hook is defined here
    var c = Java.use('com.tm.ctf.clicker.activity.c');
    var onTouchEvent = c.onTouchEvent;
    onTouchEvent.implementation = function(a) {
        var i = 1;
        while(i < 10000000){
            this.g.value = i;
            this.onTouchEvent(a);
            i++;
            console.log(i);
        }
});

(gif파일은 클릭해야 제대로 보임. 티스토리 오류인듯...)

 

그러나 10만번 클릭에 2분정도 소요. 100만번 클릭에는 20분, 1000만번 클릭에는 200분. 즉, 3시간이 넘게 걸리므로 로직을 바꿔서 클릭시, 브로드캐스트 메시지를 송신하게끔 this.g값이 3769, 10007, 59239, 100003, 495221, 1000003, 9999999가 되게 작성

Java.perform(function () {
    // Function to hook is defined here
    var c = Java.use('com.tm.ctf.clicker.activity.c');
    var onTouchEvent = c.onTouchEvent;
    onTouchEvent.implementation = function(a) {
        this.g.value = 3768;
        this.onTouchEvent(a);
        this.g.value = 10006;
        this.onTouchEvent(a);
        this.g.value = 59238;
        this.onTouchEvent(a);
        this.g.value = 100002;
        this.onTouchEvent(a);
        this.g.value = 495220;
        this.onTouchEvent(a);
        this.g.value = 1000002;
        this.onTouchEvent(a);
        this.g.value = 9999998;
        this.onTouchEvent(a);
        return true;
    }
});

 

그러나 9999999클릭된 상태에서 frida 스크립트를 unload하고 마지막 한번을 클릭하여도 flag가 나타나지 않고 앱이 종료되는 현상 나타남. 문제는 바로 CongraturationsActivity의 onCreate메서드에서 com.tm.ctf.clicker.a.a.c()메서드를 호출하여 SharedPreferences에 저장된 COUNT수가 10000000이 아니면 finish(); 가 되는것

 

adb shell로 접속하여 cat /data/data/com.tm.ctf.clicker/shared_prefs/MainPreferences.xml의 값을 살펴보면, this.g의 값은 프리다로 변조하여 9999999이 되었지만 COUNT값은 onTouchEvent 메서드가 호출된 횟수만큼만 기록되어 있음

 

Smali파일 변조하여 COUNT값이 10000000이 아니어도 앱이 종료되지 않게, if-eq값을 if-ne로 변경후 리패키징 후 설치

 

위 프리다 스크립트로 다시 후킹하고 마지막 한번을 클릭하게 되면 플래그 획득

 

반응형

+ Recent posts