JEB로 디컴파일하여 루팅 체크로직 파악.
앱 시작하면, sg.vantagepoint.a.b 클래스가 루팅여부 체크하여 boolean반환.
true(루팅되었으면)일 경우, OK버튼 클릭시 system.exit(0); 로 앱종료
sg.vantagepoint.a.b 클래스 로직 파악.
sg.vantagepoint.a.b 클래스의 a 메서드에서 su 파일 존재여부를 점검하여 있으면, true반환. 따라서, 항상 false를 반환하도록 hooking 코드를 작성하면 됨.
// rooting check bypass
Java.perform(function(){
var sg_vantagepoint_a_b = Java.use('sg.vantagepoint.a.b');
sg_vantagepoint_a_b.a.overload().implementation = function(){
return false;
}
})
verify 메서드에서는 입력한 secret이 맞는지를 검사하는데, 이는 this.m.a(v4)를 따라 들어가면,
native 함수 "bar"로 전달받은 인자를 넘겨주는 것을 확인. --> .so 파일 분석이 필요
IDA로 "libfoo.so" 파일을 열고, hex-rays plugin으로 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar의 코드를 복원하여도 보기가 까다로움.
Ghidra로 디컴파일진행하여 bar함수의 c코드를 보면 다음과 같음.
최종적으로 uVar3의 값을 return하는데, uVar3의 값은 위의 if 구문에서 1 또는 0으로 결정됨.
if문에서 uVar3 = 1로 되기 위해서는,
(1) iVar2 == 23
cmp param_1, #23 ; param1과 23을 비교하여 flag update
b.ne LAB_00100e64 ; flag값이 0이 아닌 경우 LAB_00100e64로 분기. 따라서 param1 의 값이 23이어야 LAB_00100e8c로 분기하며 strncmp함수를 실행함
(2) iVar2 == 0
cbz param_1,LAB_00100e8c ; param_1의 값이 0인 경우 LAB_00100e8c로 분기
iVar2 == 0 이 되기 위해서는 strncmp의 return 값이 0이 되어야 함.
strncmp의 원형은 다음과 같음.
int strncmp(const char* str1, const char* str2, size_t n);
str1은 비교할 문자열1, str2는 비교할 문자열2, n은 비교할 문자열 길이를 나타내며, 두 문자열이 완전히 같을 경우 0을 반환함.
따라서, strncmp 함수에서 비교되는 문자열을 관찰하면 secret을 알 수 있을것이라 판단됨.
IDA로 libfoo.so 파일 동적 디버깅 시도 시(frida로 rooting 체크 bypass하여 앱 실행 후) uncrackable2 프로세스 2개가 확인되며, 메인프로세스에 attach시도시 불가하다는 알림창이 뜸. ptrace를 통한 anti-debugging 로직이 있을것이라 판단.
Java_sg_vantagepoint_uncrackable2_MainActivity_init 함수에서 사용자 함수 FUN_00100918로 분기하고 있으며, 따라 들어가면 ptrace 호출 로직을 확인할수 있음
ptrace는 2번 호출되고 있음.
ptrace(PTRACE_ATTACH, pid, 0, 0); // attaches to the process specified in pid. 자기자신의 process pid에 붙여 버릴 경우 안티디버깅 기술이 됨. Since only one process can be attached to a certain process, another process won't be able to attach to it. This means we won't be able to attach gdb to the process
이 부분의 지시어를 nop 지시어로 변경 및 바이너리 패치하여 ptrace 호출이 일어나지 않도록 함.
패치된 libfoo.so를 포함하여 apk파일 리패키징 및 사이닝
앱 재설치 후 breakpoint 설정 후 IDA로 동적디버깅 시도시 프로세스는 하나만 있는것 확인가능하며, attach 가능.
strncmp 호출부까지 동적 디버깅을 진행하여 register값을 확인.
x0 레지스터에 내가 입력한 값인 "12345"가 들어가 있고, x1레지스터가 가르키는 주소에 가보면 비교하고자 하는 문자열인 "Thanks for all the fish"가 있음을 확인.(HEX View에서의 주소이동 단축키 G)
'Information Security > Android' 카테고리의 다른 글
Frida on Non-Rooting Device(Frida 비루팅단말) (0) | 2020.07.25 |
---|---|
gdb so파일 동적디버깅(Android 9) (0) | 2020.07.20 |
Frida Android Method Trace (0) | 2020.07.05 |
안드로이드10 Magisk 루팅(갤럭시 S9 SM-G960N) (16) | 2020.05.30 |
안드로이드 WinSCP 파일전송 (0) | 2020.05.24 |