Uncrackable1 write-up

Uncrackable1 write-up

앱 출처: https://github.com/OWASP/owasp-mstg/tree/master/Crackmes


루팅된 디바이스에서 앱 실행 시 아래와 같은 에러메시지와 함께 앱이 종료된다.




해당 부분을 이해하기 위해 분석이 필요하다.



MainActivity가 생성될 때 루팅 탐지 구문이 실행되는 것을 확인할 수 있다. 해당 함수를 따라가보면 아래와 같은 코드들이 나타나는데

해당 함수들의 smali 코드들을 하나씩 변경하여 우회할 수도 있겠지만 MainActivity의 v0.setCancelable(false); 부분을 v0.setCancelable(true); 로 변경해주면 에러메시지 발생 시 ok 버튼을 클릭하지 않고 뒤로가기를 클릭하여 우회할 수 있다.





루팅탐지를 우회하게 되면 아래와 같이 Secret String을 입력하라는 텍스트 창이 나타난다.



verify 함수를 분석해보면 a.a(v4)가 참일 경우, Success 문구가 출력되는 것을 확인할 수 있다.



a.a 함수를 분석해보면 사용자가 입력한 값과 sg.ventagepoint.a.a.a의 리턴 값을 비교하여 참 or 거짓을 반환하는 것을 확인할 수 있다.




sg.ventagepoint.a.a.a 함수를 분석해보면 AES와 관련된 암복호화 함수인것으로 보인다. 해당 리턴값과 사용자 입력값을 비교하므로 

리턴값을 출력시키면 Secret String을 확인할 수 있을 것으로 보인다.




다음은 frida를 이용하여 sg.ventagepoint.a.a.a 함수의 리턴 값을 출력 시키는 함수 이다.

import frida, sys


package_name = "owasp.mstg.uncrackable1";


def on_message(message, data):

    if message['type'] == 'send':

        print("[*] {0}".format(message['payload']))

    else:

        print(message)



jscode = """

Java.perform(function () {

console.log('[+] Hooking Start!');

console.log("");

    var aaClass = Java.use("sg.vantagepoint.a.a");

        aaClass.a.implementation = function(arg1, arg2) {

            retval = this.a(arg1, arg2);

            password = ''

            for(i = 0; i < retval.length; i++) {

               password += String.fromCharCode(retval[i]);

            }


            console.log("[*] Decrypted: " + password);

            return retval;

        }

        console.log("[*] sg.vantagepoint.a.a.a modified");

});

"""

try:

    device = frida.get_usb_device(timeout=10)

    pid = device.spawn(package_name)  

    print("App is starting ... pid : {}".format(pid))

    process = device.attach(pid)

    device.resume(pid)

    script = process.create_script(jscode)

    script.on('message',on_message)

    print('[*] Running Frida')

    script.load()

    sys.stdin.read()

except Exception as e:

    print(e)


코드에 대해 간단히 설명하면 sg.ventagepoint.a.a.a 함수의 리턴값을 retval 변수에 저장하고 password 변수에 문자열 형태로 저장한다.

그 후 console.log를 이용하여 password에 저장된 문자열을 출력한다.


해당 코드를 실행시킨 후 verify 함수를 실행한 결과이다.
하단에 I want to believe라는 문자열일 출력된 것을 확인할 수 있다.


확인한 문자열을 입력한 결과 Success라는 메시지가 출력되는 것을 확인할 수 있다.








TAGS.

Comments