개요
이 전 포스팅에서, 공개했던 Frida Hooking 용 Android App인 'MobileSecurity' 문제 정답 입니다.
해당 앱에 대한 자세한 내용이 궁금하신 분들은 아래의 링크에서 확인하시길 바랍니다.
정답
각 문제들을 우회 가능한 Frida Code가 포함되어 있습니다. 문제를 푸시기 전에 정답을 보지 않는 것을 권해드립니다.
물론, setOutput 함수를 후킹하지 않고 문제를 푸신 분들이라면 작성하신 코드 모두 정답 입니다. :-)
1. 로그인 인증 우회
문제 : 잘못된 아이디, 패스워드 입력 시 'You are Administrator' 문구 띄우기
우회 과정
get_account() 메소드의 리턴 값 변경으로 우회하기
Java.perform(function(){
var ch1 = Java.use("com.sms.mobilesecurity.Challenge1");
var SpannableStringBuilder = Java.use("android.text.SpannableStringBuilder");
ch1.get_account.implementation = function(arg1, arg2){
var id = Java.cast(arg1,SpannableStringBuilder);
var pwd = Java.cast(arg2,SpannableStringBuilder);
console.log("ID : "+id+" / PWD : "+pwd);
console.log("Login Bypass");
return 1;
}
}
2. 지문 인증 우회
문제 : 잘못된 지문 인증 시 '로그인에 성공하였습니다.' 문구 띄우기
우회 과정
onFailed 호출 시 on Successed 호출로 우회하기
Java.perform(function(){
// Challenge2
var finger = Java.use("com.sms.mobilesecurity.FingerprintHandler");
finger.onFailed.implementation = function(arg1){
this.onSuccessed("로그인에 성공하였습니다.");
console.log("Login Bypass");
}
}
3. 루팅 탐지 우회 (기본)
문제 : 루팅 탐지 수행 버튼 클릭 시 'Device is not Rooting' 문구 띄우기
우회 과정
su 명령어 실행 여부 및 File 존재 유무로 확인하는 과정 우회하기
Build.TAGS의 test-key 유무로 확인하는 과정 우회하기
Java.perform(function(){
// Challenge3
var exec = Java.use('java.lang.Runtime').exec;
var file = Java.use('java.io.File');
var tags = Java.use('android.os.Build').TAGS;
exec.overload('java.lang.String').implementation = function(arg1){
console.log("Level 1 Rooting Bypass arg : "+arg1);
var retval = this.exec("");
return retval;
}
file.$init.overload('java.lang.String').implementation = function(arg1){
console.log("Level 2 Rooting Bypass arg : "+arg1);
var retval = this.$init("");
return retval;
}
tags.value="release-keys";
}
4. 루팅 탐지 우회 (심화)
문제 : 루팅 탐지 수행 버튼 클릭 시 'Device is not Rooting' 문구 띄우기
우회 과정
su 명령어 실행 여부 및 File 존재 유무로 확인하는 과정 우회하기
Build.TAgS의 test-key 유무로 확인하는 과정 우회하기
ps 명령어를 통하여 특정 프로세스가 실행중인지 확인하는 과정 우회하기
결과를 전부 false 시키는 걸 방지하기 위해 ps 실행 중 예외 발생 시 루팅으로 탐지하는 과정 우회하기
Java.perform(function(){
// Challenge4
var exec = Java.use('java.lang.Runtime').exec;
var file = Java.use('java.io.File');
var tags = Java.use('android.os.Build').TAGS;
var buf = Java.use("java.io.BufferedReader");
exec.overload('java.lang.String').implementation = function(arg1){
console.log("Level 1 Rooting Bypass arg : "+arg1);
if(arg1=='su'){
arg1="";
}
var retval = this.exec(arg1);
return retval;
}
file.$init.overload('java.lang.String').implementation = function(arg1){
console.log("Level 2 Rooting Bypass arg : "+arg1);
var retval = this.$init("");
return retval;
}
tags.value="release-keys";
buf.readLine.overload().implementation = function(){
var retval = this.readLine();
if(retval){
if(retval.indexOf("eu.chainfire.supersu")!=-1 || retval.indexOf("xposed")!=-1 || retval.indexOf("me.twrp.twrpapp")!=-1 || retval.indexOf("com.devadvance.rootcloak")!=-1){
console.log("Level 3 Rooting Bypass ret : "+retval);
retval="";
}
}
return retval;
}
}
5. 루팅 및 후킹 탐지 우회
문제 : 후킹 탐지 수행 버튼 클릭 시 'Hooking not Detection' 문구 띄우기
우회 과정
Stack의 XposedBridge 존재 유무로 확인하는 과정 우회하기
/proc/pid/maps 데이터 중 특정 값 존재 유무로 확인하는 과정 우회하기
Java.perform(function(){
// Challenge5
var stack = Java.use("java.lang.StackTraceElement");
var fr = Java.use("java.io.FileReader");
stack.getClassName.implementation = function(){
var retval = this.getClassName();
if(retval.indexOf("XposedBridge")!=-1){
console.log("Level1 Rooting and Hooking Bypass ret : "+retval);
retval="";
}
return retval;
}
fr.$init.overload('java.lang.String').implementation = function(arg1){
if(arg1.indexOf("proc")!=-1){
console.log("Level2 Rooting and Hooking Bypass arg1 : "+arg1);
arg1="/proc/2/maps";
}
this.$init(arg1);
}
}
'Hack > Mobile' 카테고리의 다른 글
Android Smail Code Injection (0) | 2022.02.03 |
---|---|
[iOS] Burp Suite SSL Network Connection Loss Solution (0) | 2021.10.14 |
MobileSecurity App으로 Frida 관련 문제 풀어보기 (0) | 2020.09.22 |
IOS Device의 로그 데이터 Windows에서 확인하는 방법 (0) | 2020.09.22 |
[Hacking Game App] Unity mono 엔진으로 개발된 게임 앱 (0) | 2020.09.22 |
댓글