공부/안드로이드

Frida-Labs 0x1

B612 2024. 5. 13. 12:42

2023.11.24 - [공부/안드로이드] - frida 설치

 

frida 설치

frida란.. frida를 설치해봅시다 pip install frida pip install frida frida-tools frida --version 설치한 frida 버전을 확인한다. getprop ro.product.cpu.abi 에뮬레이터의 비트를 확인한다. 설치한 frida 버전 & 에뮬레이터의

peraspera.tistory.com

frida 설치는 위의 글을 참고하면 될 것 같다.

 

https://github.com/DERE-ad2001/Frida-Labs

 

GitHub - DERE-ad2001/Frida-Labs: The repo contains a series of challenges for learning Frida for Android Exploitation.

The repo contains a series of challenges for learning Frida for Android Exploitation. - DERE-ad2001/Frida-Labs

github.com

위의 링크에서 Challenge 0x1.apk 를 다운받아 진행한다.


apk 실행 화면 / 숫자를 입력했을 때의 화면

 

각각 apk를 실행했을 때의 화면, 숫자를 입력했을 때의 화면이다.

 

일단 jadx로 코드를 분석해보자

AndroidManifest.xml

제가 분석할 때 가장 먼저 하는 것은 AndroidManifest.xml 파일을 보는 것입니다.

해당 파일에는 액티비티, 패키지명 등등 가장 기본적인 정보들이 명시되어 있기 때문입니다.

 

저는 여기서 간단하게 메인액티비티가 존재한다는 점, 패키지 명이 com.ad2001.frida0x1 이라는 점을 확인한 후 넘어갔습니다.

액티비티가 하나밖에 존재하지 않기 때문에, 바로 메인액티비티를 분석해보겠습니다.

 

저 빨간 박스의 mainactivity 부분을 더블클릭하면 바로 옮겨갈 수 있습니다.

 

MainActivity 코드입니다.

읽을 수 있는 부분만 읽더라도, 문제를 푸는 데 지장이 갈 정도로 어려운 것 같진 않습니다.

 

우선, onCreate()는 액티비티를 생성할 때 실행되는 메소드입니다.

우리의 메인액티비티가 생성될 때 onCreate()는 무조건 실행된다는 소리이죠.

 

onCreate에서 중요하게 볼 부분은 아래의 빨간 두 박스인 것 같습니다.

oncreate, get_random

 

1. 우선 i에는 get_random() 함수의 결과가 들어가게 됩니다.

get_random() 함수는 밑에서 확인할 수 있는데, 구글링 해보니 0 ~ 99 의 랜덤 값이 들어간다고 합니다.

 

2. onClick 함수의 if 문에서는 우리가 입력한 숫자를 check 함수를 통해 확인하게 됩니다.

check 함수의 첫 번째 인자에는 i, 두 번째 인자에는 우리가 입력한 숫자가 들어가는군요

만약 숫자가 아니라면 Enter a valid number !! 이라는 문구가 뜨게 되죠

 

이제 check 함수를 확인해봅시다.

check

우리가 입력한 인자값이 i2로 들어갑니다!

만약 i*2+4 == i2 라면 플래그를 얻을 수 있는 것 같습니다.

 

i의 값은 어플이 실행되었을 때 단 한 번 get_random을 통해 결정되기 때문에 값이 정해진 이후에는 변경되지 않습니다. 

i를 알아내기 위해서 get_random 함수를 후킹하는 방법을 사용해보겠습니다.

 

함수에서 우클릭을 하면 프리다 코드를 작성해줍니다

아주 좋은 기능이에요....

import frida, sys

Hook_package = "com.ad2001.frida0x1"

def on_message(message, data):
    print("{} -> {}".format(message, data))

jscode = """
    Java.perform(function() {
        let MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");
        
        MainActivity.get_random.implementation = function () {
            console.log(`MainActivity.get_random is called`);
            let result = this["get_random"]();
            console.log(`MainActivity.get_random result=${result}`);
            return result;
        };
    });
"""

try:
    device = frida.get_usb_device(timeout=10)
    pid = device.spawn([Hook_package])
    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)

 

jscode의 """ """ 내부에 코드를 넣어줍니다. 이로서 코드까지 준비가 되었고, 후킹만 하면 됩니다.

 

 

기기가 연결된 것을 확인한 후, 코드를 실행시키니 i의 값이 39임을 알게 되었습니다!!

좋아요.. 그럼 우리는 i*2+4 == i2 에 따라서 39*2+4=82==i2 입니다.

 

82를 입력하고 플래그를 얻을 수 있었습니다 (〜 ̄▽ ̄)〜

'공부 > 안드로이드' 카테고리의 다른 글

Frida-Labs 0x2  (0) 2024.05.31
안드로이드 생명주기  (0) 2024.02.04
안드로이드의 저장공간에 대해  (1) 2023.12.03
Hooking (w. frida)  (0) 2023.12.03
frida 설치  (2) 2023.11.24