일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pwnable
- string
- CANARY
- Leak
- BOF
- rev
- writeup
- shellcraft
- format
- ASM
- pwnable.kr
- TUCTF
- Bottle
- Read
- reversing
- Reverse
- Rookiss
- CTF
- Bug
- practicalmalwareanalysis
- FSB
- Toddler's Bottle
- picoCTF
- shellcode
- pwn
- anti
- toddler
- 2018
- pico
- PMA
- Today
- Total
제리의 블로그
Frida-Labs 0x1 본문
오늘은 Frida-Labs 의
Frida 0x1 을 풀어보겠습니다
그럼 ~~
레츠 꼬!!
Frida-Labs/Frida 0x1 at main · DERE-ad2001/Frida-Labs
The repo contains a series of challenges for learning Frida for Android Exploitation. - DERE-ad2001/Frida-Labs
github.com
1. 기능을 확인하기 ⚽
크게 3가지가 있다.
Enter the number 라는
TextView 가 있고. 1️⃣
입력 가능한
EditText 가 있고 2️⃣
Submit 이라고 적혀있고
클릭 가능한
Button 이 있다. 3️⃣
일단
Enter the number 는
숫자를 입력하라는 뜻이므로
숫자를 입력 후
버튼을 눌러보자 💪
`Try again` 이라는
문자열이 출력되는 것을 알 수 있었다.
그리고 저 창은
토스트창이라고 한다. 💬
이번엔
숫자가 아닌 값을 입력 후
버튼을 눌러보자 🤜
`Enter a vaild number !!` 라는
문자열이 출력되는 것을 알 수 있었다. 🗯️
이제 출력된 문자열과
구성요소들을 하나하나 찾아가볼까??
2. AndroidManifest.xml 에서 MainActivity 찾기 👁️🗨️
그 다음으로 해야할 것은
바로바로
MainActivity를 찾는 것!
jadx-gui 로
AndroidManifest.xml 을 확인해보면
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
위 두가지가 있는
activity 가
바로 MainActivity 이다.
예제에서는
`com.ad2001.frida0x1.MainActivity`로
이름 자체가
MainActivity 로 되어 있어서
찾기 쉽지만..
이름이 MainActivity가 아닐 수도 있기 때문에 ❕
action과 category가 MAIN, LAUNCHER 인
activity를 찾으면 된다.
그럼
jadx-gui에서
`com.ad2001.frida0x1.MainActivity`를
더블클릭하거나 ⏩
Ctrl+클릭하면
해당 activity를 볼 수 있다.
3. MainActivity 분석하기 🛠️
MainActivity에 와서
문자열 찾아본다.
`Enter a valid number !!` 정도는
물구나무 서서도 찾을 수 있었따.. 😎
public void onClick(View view) {
String obj = editText.getText().toString();
if (TextUtils.isDigitsOnly(obj)) {
MainActivity.this.check(i, Integer.parseInt(obj));
} else {
Toast.makeText(MainActivity.this.getApplicationContext(), "Enter a valid number !!", 1).show();
}
}
if 절을 보면
isDigitsOnly()
숫자만 왔는지 확인하는 메소드인 것을
짐작할 수 있었다.
즉, 숫자가 아닌 값이 포함되면
`Enter a vaild number !!` 를 출력하도록 만든 것이다.
그럼
숫자만 입력 했을 때
MainActivity.this.check() 를 분석해보자.
check에 커서를 두고
더블 클릭을 하면 ⏩
해당 선언문으로
갈 수 있다.
line 60 부터
check 선언문이다.
맨 처음에 기능을 확인할 때
토스트창으로 보았던
`Try again` 이 있는 것을 확인하였다.
void check(int i, int i2) {
if ((i * 2) + 4 == i2) {
Toast.makeText(getApplicationContext(), "Yey you guessed it right", 1).show();
StringBuilder sb = new StringBuilder();
for (int i3 = 0; i3 < 20; i3++) {
char charAt = "AMDYV{WVWT_CJJF_0s1}".charAt(i3);
if (charAt < 'a' || charAt > 'z') {
if (charAt >= 'A') {
if (charAt <= 'Z') {
charAt = (char) (charAt - 21);
if (charAt >= 'A') {
}
charAt = (char) (charAt + 26);
}
}
sb.append(charAt);
} else {
charAt = (char) (charAt - 21);
if (charAt >= 'a') {
sb.append(charAt);
}
charAt = (char) (charAt + 26);
sb.append(charAt);
}
}
this.t1.setText(sb.toString());
return;
}
Toast.makeText(getApplicationContext(), "Try again", 1).show();
}
if 절을 보면
`(i * 2) + 4 == i2` 를 만족하면
그 아래 무언가 이루어지고 있고
그렇지 않으면
`Try again` 이 출력된다.
그렇기 때문에
if 절이
만족하려면
어떻게 해야하는지
알아보자. 😤
void check(int i, int i2) {
if ((i * 2) + 4 == i2) {
i 와 i2 는
check 메소드의
인자 값들이다.
첫 매개변수인 i 는
`get_random()` 값이고
`get_random()` 값은
int get_random() {
return new Random().nextInt(100);
}
0~99 사이의 정수값이다.
그리고
두번째 매개변수인 Integer.parseInt(obj) 는
`editText.getText().toString()` 인데
이는
editText = 입력창에서
getText() = 텍스트를 가져와서
toString() = 문자열로 캐스팅한 값이라는 뜻이다.
즉, 입력한 문자열이
두번째 매개변수로 들어가게 된다.
다시 정리하자면
첫번째 매개변수는
0~99 사이의 값
두번째 매개변수는
입력값
그렇다면
첫번째 매개변수가 뭔지 알아야
입력값을 결정할 수 있게된다.
4. frida 로 get_random() 값 확인하기 💬
메소드에 커서를 두고
우클릭을 하면
'frida 스니펫으로 복사' 가 있다.
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}`);
console.log(`${result}` * 2 + 4);
return result;
};
});
get_random의 결과값 = 53
53 * 2 + 4 = 110
그럼 110을 입력하면?!
화면에
`FRIDA{BABY_HOOK_0x1}`
출력되고
`Yey you guessed it right` 도
토스트창으로
출력되었다.
5. 방법 정리 💯
1. 기능 확인 🧡
TextView, EditText, Button 의 구성과
각종 문자열들을 뽑아낸다.
2. MainActivity 찾기 💛
AndroidManifest.xml 에서 찾을 수 있다.
3. MainActivity 분석 💚
OnCreate 에서 액티비티가 실행될 때를 알 수 있다.
그리고 메인액티비티에서 각종 문자열들을 확인할 수 있었다.
4. frida 후킹 💙
분석 결과 `get_random()` 의 결과값을 알아야
입력값을 계산할 수 있었다.
jadx로 frida 스니펫을 만들어 썼다.
6. 나머지 💦
TextView, EditText, Button 정보에 대한 레이아웃을 알아보자.
onCreate 부분을 보면
R.layout.activity_main 을 확인할 수 있는데
이게 바로 액티비티의 레이아웃이다. 📃
res/layout/activity_main.xml
경로로 들어가보자.
그러면 TextView, EditText, Button 에 대한 정보가 나와있다.
자세히 하나하나 보다보면
`Enter the number` 라던지
`Submit` 등의 정보를 확인할 수 있다. 😆
다음은
onCreate 를 집중분석해보자.
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main); // res/layout/activity_main.xml
// 입력창 EditText 선언
final EditText editText = (EditText) findViewById(R.id.editTextTextPassword);
// Button 선언
Button button = (Button) findViewById(R.id.button);
// TextView 선언
this.t1 = (TextView) findViewById(R.id.textview1);
}
다시보니
모든 구성요소에 대해서
선언되어 있네요..? 🙄
끝! ꉂ🤣