본문 바로가기
보안 및 개발/MOBILE

[Android] OWASP UnCrackable 2

by CH@3M 2020. 1. 20.

apk는 다음 링크에서 받을 수 있다.

https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_02/UnCrackable-Level2.apk

apk를 실행시키면 루팅탐지를 한다. 

우회하는 방식은 앞에서 했던 방식과 같다.

루팅탐지를 우회하면 string을 입력하는 화면이 나온다.

Nope을 우회하여 Success를 띄우도록 해야한다.

Success를 위해서는 this.m.a(v4) 함수를 호출하는데, 그 함수는 다음과 같다.

나는 a 함수의 return 값이 false이길래, 이걸 true로 바꿔주니까 우회가 됐다. 하지만, Success로 가는 문자열을 알아내는 방식이 더 공부가 되는 방법이다. 이 풀이 방법은 아래에 다시 이어서 설명하기로!!!

Java.perform(function () {
    var ch = Java.use("sg.vantagepoint.uncrackable2.CodeCheck");
    var ex = Java.use("java.lang.System");

    ex.exit.implementation = function (v) {
        console.log("system exit bypass");
    }
    ch.a.implementation = function (v) {
        var retval = this.a(v);
        retval = true;
        console.log(retval);
        return retval;
    }
  });

 


※ 라이브러리 함수 리버싱 방법

제대로 공부하려면 a함수의 return 값이 this.bar(arg1.getBytes())로, 아래의 bar함수를 봐야하는데 bar함수에는 아무것도 써있지 않다. 그리고 앞에 native가 붙어있는 것으로 보아, 라이브러리 함수인 것을 알 수 있다. 

MainActivity를 다시 보면, foo라는 함수를 호출하고 있는 것을 알 수 있다.

apk의 압축을 해제하고 library 폴더를 보면, libfoo.so 파일이 있다. IDA로 바이너리를 열어보면, bar 함수가 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 이런 식으로 있는 것으로 볼 수 있다. 문자열은 총 23bytes인 것으로 보인다. 위에서 문자열을 조합하고 있다.

v7 = xmmword_EA0; 를 클릭하여 이동한다. 마우스 오른쪽을 클릭하여 문자로 변환하면 다음과 같은 문자열이 있는 것을 볼 수 있다. 

이를 연결하여 입력하면 Success가 뜬다.

 


※ strncmp 함수 hooking 방법

프로세스 내 함수를 후킹하기 위해서는 Interceptor API를 이용한다. Low Memory나 지정된 라이브러리에 접근 가능하다.

 

Interceptor.attach(addr, callback)

- addr 은 후킹할 함수의 시작 주소이다

- callback 은 attach 직후 실행할 실제 코드가 들어간다. 다음의 형식을 갖는다.

{ onEnter: function (args) {...}, onLeave: function (retval) {...} }

- onEnter : 후킹한 함수가 호출될 때 실행할 코드, args는 후킹한 함수가 전달받는 인수의 배열이다

- onLeave : 후킹한 함수가 종료될 때 실행할 코드, retval 는 후킹한 함수의 리턴 값이다.

- args, retval 는 단순히 후킹한 함수의 값들이 저장된 변수가 아니라 실제 해당 값들의 포인터이다. 즉, args, retval 의 값을 변경하면 해당 함수의 실제 값이 변경된다.

frida 형식 설명 : http://egloos.zum.com/playgame/v/2232039 참고

 

Java.perform(function () {
    //var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    var ch = Java.use("sg.vantagepoint.uncrackable2.CodeCheck");
    var ex = Java.use("java.lang.System");

    ex.exit.implementation = function (v) {
        console.log("system exit bypass");
    }

    var strncmp = undefined;
    var func = Module.enumerateImportsSync("libfoo.so");
    for(var i=0; i<func.length; i++) {
        if(func[i].name == "strncmp") {
            strncmp = func[i].address;
            break;
        }
    }
    Interceptor.attach(strncmp, {
        onEnter: function (args) {
            if(args[2].toInt32() == 23 && Memory.readUtf8String(args[0],23) == "01234567890123456789012") {
                console.log("[*] Secret string : " + args[1] + "//" + Memory.readUtf8String(args[1],23));
            }
        }
    })

  });

출처 : https://gflow-security.tistory.com/entry/Android-App-Hooking-with-Frida2

 

 

반응형