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를 실행했을 때의 화면, 숫자를 입력했을 때의 화면이다.
일단 jadx로 코드를 분석해보자

제가 분석할 때 가장 먼저 하는 것은 AndroidManifest.xml 파일을 보는 것입니다.
해당 파일에는 액티비티, 패키지명 등등 가장 기본적인 정보들이 명시되어 있기 때문입니다.
저는 여기서 간단하게 메인액티비티가 존재한다는 점, 패키지 명이 com.ad2001.frida0x1 이라는 점을 확인한 후 넘어갔습니다.
액티비티가 하나밖에 존재하지 않기 때문에, 바로 메인액티비티를 분석해보겠습니다.
저 빨간 박스의 mainactivity 부분을 더블클릭하면 바로 옮겨갈 수 있습니다.

MainActivity 코드입니다.
읽을 수 있는 부분만 읽더라도, 문제를 푸는 데 지장이 갈 정도로 어려운 것 같진 않습니다.
우선, onCreate()는 액티비티를 생성할 때 실행되는 메소드입니다.
우리의 메인액티비티가 생성될 때 onCreate()는 무조건 실행된다는 소리이죠.
onCreate에서 중요하게 볼 부분은 아래의 빨간 두 박스인 것 같습니다.

1. 우선 i에는 get_random() 함수의 결과가 들어가게 됩니다.
get_random() 함수는 밑에서 확인할 수 있는데, 구글링 해보니 0 ~ 99 의 랜덤 값이 들어간다고 합니다.
2. onClick 함수의 if 문에서는 우리가 입력한 숫자를 check 함수를 통해 확인하게 됩니다.
check 함수의 첫 번째 인자에는 i, 두 번째 인자에는 우리가 입력한 숫자가 들어가는군요
만약 숫자가 아니라면 Enter a valid number !! 이라는 문구가 뜨게 되죠
이제 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 |