apk는 다음 링크에서 받을 수 있다.
https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_02/UnCrackable-Level2.apk
apk를 실행시키면 루팅탐지를 한다.
우회하는 방식은 앞에서 했던 방식과 같다.
루팅탐지를 우회하면 string을 입력하는 화면이 나온다.
Nope을 우회하여 Success를 띄우도록 해야한다.
Success를 위해서는 this.m.a(v4) 함수를 호출하는데, 그 함수는 다음과 같다.
나는 a 함수의 return 값이 false이길래, 이걸 true로 바꿔주니까 우회가 됐다. 하지만, Success로 가는 문자열을 알아내는 방식이 더 공부가 되는 방법이다. 이 풀이 방법은 아래에 다시 이어서 설명하기로!!!
Java.perform(function () {
var ch = Java.use("sg.vantagepoint.uncrackable2.CodeCheck");
var ex = Java.use("java.lang.System");
ex.exit.implementation = function (v) {
console.log("system exit bypass");
}
ch.a.implementation = function (v) {
var retval = this.a(v);
retval = true;
console.log(retval);
return retval;
}
});
※ 라이브러리 함수 리버싱 방법
제대로 공부하려면 a함수의 return 값이 this.bar(arg1.getBytes())로, 아래의 bar함수를 봐야하는데 bar함수에는 아무것도 써있지 않다. 그리고 앞에 native가 붙어있는 것으로 보아, 라이브러리 함수인 것을 알 수 있다.
MainActivity를 다시 보면, foo라는 함수를 호출하고 있는 것을 알 수 있다.
apk의 압축을 해제하고 library 폴더를 보면, libfoo.so 파일이 있다. IDA로 바이너리를 열어보면, bar 함수가 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 이런 식으로 있는 것으로 볼 수 있다. 문자열은 총 23bytes인 것으로 보인다. 위에서 문자열을 조합하고 있다.
v7 = xmmword_EA0; 를 클릭하여 이동한다. 마우스 오른쪽을 클릭하여 문자로 변환하면 다음과 같은 문자열이 있는 것을 볼 수 있다.
이를 연결하여 입력하면 Success가 뜬다.
※ strncmp 함수 hooking 방법
프로세스 내 함수를 후킹하기 위해서는 Interceptor API를 이용한다. Low Memory나 지정된 라이브러리에 접근 가능하다.
Interceptor.attach(addr, callback)
- addr 은 후킹할 함수의 시작 주소이다
- callback 은 attach 직후 실행할 실제 코드가 들어간다. 다음의 형식을 갖는다.
{ onEnter: function (args) {...}, onLeave: function (retval) {...} }
- onEnter : 후킹한 함수가 호출될 때 실행할 코드, args는 후킹한 함수가 전달받는 인수의 배열이다
- onLeave : 후킹한 함수가 종료될 때 실행할 코드, retval 는 후킹한 함수의 리턴 값이다.
- args, retval 는 단순히 후킹한 함수의 값들이 저장된 변수가 아니라 실제 해당 값들의 포인터이다. 즉, args, retval 의 값을 변경하면 해당 함수의 실제 값이 변경된다.
frida 형식 설명 : http://egloos.zum.com/playgame/v/2232039 참고
Java.perform(function () {
//var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
var ch = Java.use("sg.vantagepoint.uncrackable2.CodeCheck");
var ex = Java.use("java.lang.System");
ex.exit.implementation = function (v) {
console.log("system exit bypass");
}
var strncmp = undefined;
var func = Module.enumerateImportsSync("libfoo.so");
for(var i=0; i<func.length; i++) {
if(func[i].name == "strncmp") {
strncmp = func[i].address;
break;
}
}
Interceptor.attach(strncmp, {
onEnter: function (args) {
if(args[2].toInt32() == 23 && Memory.readUtf8String(args[0],23) == "01234567890123456789012") {
console.log("[*] Secret string : " + args[1] + "//" + Memory.readUtf8String(args[1],23));
}
}
})
});
출처 : https://gflow-security.tistory.com/entry/Android-App-Hooking-with-Frida2
'보안 및 개발 > MOBILE' 카테고리의 다른 글
[Android] SuCTF 2014 Reverse200 (0) | 2020.01.29 |
---|---|
[Android] OWASP UnCrackable 3 미완료 ㅠ (0) | 2020.01.21 |
[Android] OWASP UnCrackable 1 (0) | 2020.01.17 |
[Android] frida hooking 연습 문제 (0) | 2020.01.16 |
[android] 디컴파일 (dex2jar, jd-gui, jadx-gui) (0) | 2019.12.23 |