Notice
Recent Posts
Recent Comments
Link
Tags
- Directory traversal
- UnCrackable level 1
- CVE-2022-22965
- HacktheBox Mobile
- Hackthebox cat
- nginx
- JAVA ClassLoader 취약점
- XALZ 압축해제
- MariaDB
- NoSQL
- Frida
- SeeTheSharpFlag
- mstg
- blind sql injection
- HackTheBox
- Xamarin 분석
- mongoDB
- UnCrackable
- Android 6.0
- getCachedIntrospectionResults
- CVE-2010-1622
- JSP
- DOM
- login form
- CVE-2014-0094
- xss
- Android Backup
- HackTheBox APKey
- File Upload
- PortSwigger
Archives
- Today
- Total
끄적끄적
[Frida] FridaLab 본문
사용 도구
NOX
JADX
Frida
실행중인 앱의 패키지명을 확인하고 싶은 경우 "adb shell"로 접속 후 "ps | grep [app_name]" 명령어로 확인하자
FridaLab 패키지명: uk.rossmarks.fridalab
Challenge_01
클래스내 변수 값을 변경
setImmediate(function(){
Java.perform(function(){
console.log("[+] Change Class challenge_01's variable 'chall01' to:1");
var target = Java.use("uk.rossmarks.fridalab.challenge_01"); //클래스 위치 설정
target.chall01.value = 1; //클래스 내 변수 값을 설정
})
});
Challenge_02
클래스 내 특정 instance 메소드 호출
Java.choose() 사용
setImmediate(function(){
Java.perform(function(){
console.log("[+] Run chall02()");
Java.choose("uk.rossmarks.fridalab.MainActivity",
{
"onMatch":function(Call_callange_2){
Call_callange_2.chall02();
},
"onComplete" : function(){
console.log("[+] Complete");
}
})
})
});
Java.use() 사용
setImmediate(function(){
Java.perform(function(){
console.log("[+] Run chall02()");
var target = Java.use("uk.rossmarks.fridalab.MainActivity");
target.chall05.implementation = function(arg){
this.chall02();
}
})
});
static 메소드를 호출: Java.use()
instance 메소드를 호출: Java.choose()
Challenge_03
Java.use()함수와 implementation을 사용하여 함수 로직 변경
setImmediate(function(){
Java.perform(function(){
console.log("[+] Make Chall03() return true");
var target = Java.use("uk.rossmarks.fridalab.MainActivity");
target.chall03.implementation = function(){ //chall03은 메소드
return true
}
})
});
Challenge_04
Java.choose() 사용하여 매개변수 할당 로직을 변경(인스턴스 메소드를 호출)
setImmediate(function(){
Java.perform(function(){
console.log("[+] Send \'frida\' to chall04()");
Java.choose("uk.rossmarks.fridalab.MainActivity",{
"onMatch":function(Call_callange_4){
Call_callange_4.chall04("frida");
},
"onComplete" : function(){
console.log("[+] Complete");
}
}
)})
});
Challenge_05
chall05() 메소드를 호출할 때 마다 "frida" 매개변수 전달
setImmediate(function(){
Java.perform(function(){
console.log("[+] Always send \'frida\' to chall05()");
var target = Java.use("uk.rossmarks.fridalab.MainActivity");
target.chall05.implementation = function(arg){
this.chall05("frida");
}
})
});
다른 동일한 이름의 chall05() 메소드가 존재할 경우 "java.lang.String"을 오버로딩할 수 있음
Challenge_06 ★
Chall06_class 변수에 challenge_06 클래스 저장 후 해당 클래스에 있는 addChall06() 메소드를 재작성
addChall06() 메소드는 MainActivity 클래스내에서 호출할 때 chall06 값을 결정하므로 해당 클래스의 인스턴스를 가져와 정답을 체크하는 chall06() 메소드를 호출
이때 addChall06() 메소드를 호출하면서 challenge_06 클래스에 정의된 chall06 변수의 값을 인자로 전달
setTimeout(function() {
setImmediate(function(){
Java.perform(function(){
console.log("[+] Run chall06() after 10 seconds with correct value");
console.log("[+] Hooking challenge_06 Method");
var Chall06_class = Java.use("uk.rossmarks.fridalab.challenge_06"); //challenge_06 클래스에 후킹
Chall06_class.addChall06.implementation = function(arg){ //addChall06 호출 시점으로 설정
Java.choose("uk.rossmarks.fridalab.MainActivity",
{
"onMatch":function(instance){ //메인 엑티비티 클래스를 인스턴스로 설정
instance.chall06(Chall06_class.chall06.value); //challenge_06 내의 chall06 변수를 chall06() 인스턴스의 매개변수로 전달
console.log("[*] value: "+ Chall06_class.chall06.value);
},
"onComplete":function(){
console.log("[+] Hooking Complete")
}
}
)
}
})
});
console.log("[+] RunTime 10 Seconds ... ");
}, 10000);
Challenge_07 ★
무작위 대입 공격을 통해 랜덤한 값을 찾기
setImmediate(function(){
Java.perform(function(){
console.log("[+] Bruteforce check07Pin() then confirm with chall07()");
var target = Java.use("uk.rossmarks.fridalab.challenge_07");
Java.choose("uk.rossmarks.fridalab.MainActivity",
{
"onMatch":function(instance)
{
for(var i=1000;i<=9000;i++)
{
var str_i = String(i);
if(target.check07Pin(str_i)) //challenge_07 클래스의 check07Pin() 메소드를 사용하여 값 일치 여부 확인
{
instance.chall07(str_i); //메인 엑티비티의 chall07() 메소드 호출
break;
}
}
},
"onComplete":function()
{
console.log("[+] Complete");
}
})
})
});
Challenge_08 ★★
안드로이드 내장 클래스 후킹하기
setImmediate(function(){
Java.perform(function(){
console.log("[+] Change \'check\' button\'s text value to \'Confirm\'");
var target = Java.use("android.widget.Button");
Java.choose("uk.rossmarks.fridalab.MainActivity",
{
"onMatch":function(instance)
{
var checkId = instance.findViewById(2131165231); //check의 정수 값
var check = Java.cast(checkId, klass); //"Button"으로 형변환
var string = Java.use("java.lang.String");
check.setText(string.$new("Confirm")); //인스턴스 생성
},
"onComplete":function()
{
console.log("[+] Complete");
}
})
})
});
Java.cast(handle, klass): handle에 전달된 인스턴스를 klass의 클래스로 캐스팅(형변환)하는 함수
Reference
'Security > Mobile' 카테고리의 다른 글
[Frida] Useful Code (0) | 2021.10.20 |
---|---|
[Frida] 기본 문법 (0) | 2021.10.18 |
[Frida] Hooking Code Sample(Python) (0) | 2021.10.17 |
[Android analysis] Android Dalvik Opcode(Smali Code) (0) | 2021.09.12 |
[Android analysis] 디컴파일 및 리패키징 (0) | 2021.09.12 |
Comments