상세 컨텐츠

본문 제목

[Android] 프리다를 이용한 안드로이드 앱 후킹 (Level2)

기술보안/Mobile:Android

by about_SC 2019. 1. 16. 10:31

본문

아래의 경로에서 문제를 받아볼 수 있었다.
https://github.com/OWASP/owasp-mstg/tree/master/Crackmes

(도구 설치 방법론은 다루지 않는다)


분석환경
:
OS : Win7
TOOL : Frida, Frida-server, adb, Python2.7, Nox

1) 후킹할 APP을 설치한다.


2) 실행 시 루팅 탐지 로직을 확인한다.
이를 우회하는 방법은 이전 포스팅 게시물을 참조하도록 하자.


3) 해당 APP을 JEB로 분석 시 자바 소스코드 파일로 볼 수 있다.
APP이 시작되는 시점에서 아래와 같은 루팅 탐지 로직을 확인할 수 있다.


4) verify 메소드에서 입력한 코드의 검증이 이루어지는 것을 확인할 수 있다.
if(this.m.a(v4)) 분기문을 통해 사용자 입력 값에 대한 확인 절차를 거쳐 검증 결과를 뿌려주는 것을 확인할 수 있다.
따라서, a() 메소드를 따라들어가보자.


5) 따라들어가보면, a() 메소드 내부에 this.bar(arg1.getBytes()); 코드를 확인할 수 있다.
사용자 입력 값이 bar 메소드를 통해 어떠한 작업이 이루어짐을 확인할 수 있다.
bar 메소드는 native 키워드를 통해 JNI를 사용함을 확인할 수 있다.
(JNI 설명은 다음 포스팅 게시물을 참조하도록 하자)


6) (4) 과정의 코드 상단을 확인해 보면 LoadLibrary() 시스템 메소드를 통해
C/C++로 작성된 foo.so 파일을 읽어오는 것을 확인할 수 있다.


7) APP을 디컴파일 하면 foo.so 파일을 확인할 수 있다.
해당 파일을 IDA를 통해 분석해보기로 하자.
IDA를 통해 분석 시 모듈의 시작부분에 아래와 같은 클래스를 확인할 수 있다.


8) 함수를 분석하다보면 R0, #0x17을 비교하여 strncmp 함수를 호출하는 영역으로 분기하는 구간을 확인할 수 있다.
#0x17은 십진수로 23이고 문자열 길이가 23이면 strncmp 함수를 호출하는 영역으로 넘어가도록 동작하는 것을 유추할 수 있다.
우리는 여기서 Secret String의 길이가 23임을 파악할 수 있다.


9) 디컴파일 시 위의 내용을 더 자세히 확인할 수 있다.


10) 자, 이제 후킹 코드를 작성해보자.
strncmp 함수는 문자열을 비교하여 그 결과를 반환하는 함수로서
Secret String을 입력받아 비교하는 결과를 반환하는 동작을 수행하게 된다.
우리는 strncmp 함수의 인수를 출력함으로서 Secret String 을 확인할 수 있게된다.

uncrack2.py

uncrackable2.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import frida, sys
 
def on_message(message, data):
    if message['type'== 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
 
  
PACKAGE_NAME = "owasp.mstg.uncrackable2"
 
jscode= """
    Java.perform(function() {
        console.log("[*] Hooking calls to System.exit");
        exitClass = Java.use("java.lang.System");
        exitClass.exit.implementation = function() {
            console.log("[*System.exit called");
        }

        var strncmp = undefined;
        func = Module.enumerateImportsSync("libfoo.so");

        for(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 string2 at " + args[1] + "" + Memory.readUtf8String(args[1],23));
                }
             },
        });

        console.log("[*] Intercepting strncmp");
    });
"""

try:
    device = frida.get_usb_device(timeout=10)
    pid = device.spawn([PACKAGE_NAME])  
    process = device.attach(pid)
    device.resume(pid)
    script = process.create_script(jscode)
    script.on('message',on_message)
    print('[*] Running Hook')
    script.load()
    sys.stdin.read()
except Exception as e:
    print(e)
 
cs


Module.enumerateImportsSync() 를 이용하여 libfoo.so 라이브러리 존재하는 함수를 불러오게되고,
그 중 strncmp 함수를 찾아 해당하는 함수의 주소 값을 구하게 된다.


설명 : console.log("[*] Secret string2 at " + args[1] + "" + Memory.readUtf8String(args[1],23)); 그 중 JAVA 문자열은 NULL로 끝나지 않는다.
따라서 Frida의 Memory.readUtf8String 메소드로 문자열 포인터의 메모리 위치에 엑세스할 때
길이를 제공하지 않으면 Frida는 문자열이 끝나는 곳을 알 수 없어 에러가 발생하게 된다.
따라서 두번째 인수로 읽을 문자의 양을 지정하면 에러가 해결이 된다.

설명 : if(args[2].toInt32() == 23 && Memory.readUtf8String(args[0],23) == "01234567890123456789012") { 그 중 JAVA 문자열은 NULL로 끝나지 않는다. 
strncmp 인수를 덤프하는 조건에 제약 조건을 두지 않으면 많은 결과가 발생하게 된다.
따라서 3번째 인자의 인수가 23일 때, 1번째 인자가 01234567890123456789012(23개의 문자) 일때
출력하도록 조건을 걸어주면 에러가 해결이 된다.


11) 후킹 코드를 실행시켜보자.
앱을 실행하면 루팅 탐지 로직이 실행되는데 여기서 OK 버튼을 누르면
단순 디버그 로그를 출력하며 루팅탐지 로직을 우회하게 된다.


후킹코드에 조건으로 설정한 23개 문자를 입력해보자.


입력 후 Verify 버튼 클릭 시 strncmp 함수가 호출되어
Secret String과 일치하지 않음을 확인할 수 있다.



콘솔 창 확인 시 hooking이 성공하여 Secret String의 값을 확인할 수 있다.
해당 값은 : Thanks for all the fish
라는 것을 확인할 수 있다.



지금까지 uncrack2.apk 샘플 파일을 통해 프리다를 이용한 안드로이드 앱 후킹을 알아보았다.
참고한 사이트는 아래에 기재하였다.

참고 : 
https://www.codemetrix.io/hacking-android-apps-with-frida-3/
https://gflow-security.tistory.com/entry/Android-App-Hooking-with-Frida2?category=278801


관련글 더보기