일단 쓰고보자

Uncrackable-Level1 문제 풀이(frida Hooking) 본문

모의해킹/Uncrackable

Uncrackable-Level1 문제 풀이(frida Hooking)

휘갈기갈기 2020. 3. 25. 13:46

 

#서론

이전 게시글에 Uncrackable-Level1.apk 풀이를 업로드 했었다.

 

apk 파일 Decompile 한 후 smail 파일 직접 수정 및 JEB 디버깅을 통해 풀어보았는데

 

이번엔 frida를 사용하여 Hooking code 작성함으로써 문제를 해결해볼 예정이다.

 

Hooking을 통해 우회하는 것의 장점은 앱 자체 수정이 필요 없다는 점에 있다.

 

간혹, 자체 코드든 솔루션을 사용하든 앱 무결성을 탐지하는 앱의 경우,

 

아무리 내부 수정을 하더라도 설치가 어렵거나, 되더라도 정상 작동이 되지 않을 수 있기 때문이다.

 

혹은, 내부 무결성을 우회하는 시간이 더 걸릴 때도 있다.

 

무슨 짓을 하던 원하는 것을 얻어내기만 하면 되므로, 시도해볼 수 있는 방법이 여러개인 것이 나쁠 것은 없다.

 


#준비물

1. Nox

2. ADB

3. Python

4. Hooking Code

5. Uncrackable-Level1.apk

6. JEB


#시작

frida Hooking은 심플하다.

1) 스마트폰에서 frida-server 실행

2) Python으로 Hooking 코드 실행

 

frida-server 등 준비물들 설치하는 방법은 이전 글 참고바란다.

https://kinghy7.tistory.com/1?category=791142

Nox 에서 fridump3 로 메모리 덤프하기

#서론 이 간단한 걸 하기 위해 얼마나 삽질을 했는가 #목차 1. Nox 설치 2. Python 설치 3. frida-server 설치 4. fridump 설치 5. frida 설치 6. 대상 앱 설치 및 메모리 덤프 #시작 1. Nox 설치 - 메인 페이지에..

kinghy7.tistory.com

 

[스마트폰]

1. Uncrackable1 앱 설치

- Nox 에서는 APK 파일 드래그만으로 설치가 가능함

 

2. frida-server 설치 및 실행

- 아래 명령어로 밀어넣어도 되고, Nox로 드래그 해도 된다.

c:\> adb push [Windows 내 frida-server 파일경로] [스마트폰 내 설치경로]

 

예) 다운로드 폴더에 위치한 frida-server-12.8.9-android-arm 파일을 스마트폰 /data/local/tmp/ 경로 안에 frida-server 로 변경하여 밀어넣겠다.

c:\> adb push C:\Users\Administrator\Downloads\frida-server-12.8.9-android-arm /data/local/tmp/frida-server

 

- frida-server 실행 

# /data/local/tmp/./frida-server &

 

[PC]

3. 코드 분석하여 Hooking 대상 함수 선정

- 코드 분석하여 Hooking 대상 함수 찾는 부분은 이전 글 참고바란다.

https://kinghy7.tistory.com/3?category=791142

Uncrackable-Level1 문제 풀이

#서론 실제 푸는 것보다 환경설정 하는데 더 애먹음 #준비물 1. Nox 2. JEB (소스 분석, 동적 디버깅) 3. ADB (사실 그닥 필요 없음) 4. APK Manager (디컴파일) 5. UnCrackable-Level1 앱 #시작 1. Nox 내 UnCrac..

kinghy7.tistory.com

 

 

1) Rooting, Debugging 탐지 우회

sg.vantagepoint.uncrackable1.MainActivity 클래스 내 사용된 System.exit 함수

※ 사실 System.exit 함수는 java.lang.System 클래스에 선언되어 있음

 

 

2) SecretKey 값

sg.vantagepoint.a.a 클래스 내 a 함수

 

 

 

4. Hooking 코드 작성(*****)

- 기본 틀은 아래와 같고, 골자 부분은 jscode 부분이라고 보면 된다.

가져다 쓰실 땐 코드 전체 복사하신 후 PACKAGE_NAME, jscode 부분만 수정해서 쓰시면 되겠다.

 

- PACKAGE_NAME 변수에 패키지명을 작성하도록 되어 있는데, 패키지명은 아래 명령어를 통해 얻도록 하자.

    #pm list packages -f | grep uncrackable1

    package:/data/app/owasp.mstg.uncrackable1-1/base.apk=owasp.mstg.uncrackable1

import frida, sys

def on_message(message, data):
	if message['type'] == 'send':
		print("[*] {0}".format(message['payload']))
	else:
		print(message)

PACKAGE_NAME = "[패키지명]"

jscode = """
    Java.perform(function() {
    	var [변수1] = Java.use("[Hooking할 함수의 클래스]");
        [변수1].[Hooking할 함수].implementation = function (args){
        	[원하는 코드 작성]
        }
    
    });
"""

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)

- 코드 실행시켜보고 동작이 잘 되는지 의문이 생기면 아래와 같이 실행창에 로그를 남겨서 확인하기를 추천한다.

    console.log("~~ 함수 들어옴");

    console.log("~~ 함수 값 : " + asdf);

 

5. 작성한 Hooking 코드 전문

더보기
import frida, sys

def on_message(message, data):
	if message['type'] == 'send':
		print("[*] {0}".format(message['payload']))
	else:
		print(message)

PACKAGE_NAME = "owasp.mstg.uncrackable1"

jscode = """
    console.log("[*] Start Hooking");
    Java.perform(function() {
        
        var bypassExit = Java.use("java.lang.System");
        bypassExit.exit.implementation = function (){
            console.log("[*] System.exit() is called");
        }
        
        var aClass = Java.use("sg.vantagepoint.a.a");
        aClass.a.implementation = function (a, b){
            console.log("[*] aClass.a function is called");
            var findCode = this.a(a, b);
            var secret = "";
            for (var i=0; i<findCode.length; i++){
                secret = secret + String.fromCharCode(findCode[i]);
            }
            console.log("[*] SecretKey = " + secret);
            return findCode;
        }
    });
"""
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)

 

 

지금은 Uncrackable-Level2 를 풀어보고 있는데, 이번엔 네이티브 함수를 후킹해야 할 것 같다.

 

무궁무진한가보다 ㅎㅎ...


#오류

없다. 머리가 아프다.


 

'모의해킹 > Uncrackable' 카테고리의 다른 글

Uncrackable-Level2 문제 풀이(frida Hooking)  (0) 2020.04.01
Uncrackable-Level1 문제 풀이  (0) 2020.02.10