0) 실습준비
•
Uncarkable2.apk 설치
•
루팅 감지 회피는 진행한 상태에서 시작한다
1) 정적분석 시작(jadx-gui)
MainActivity 클래스에서 "Success!" 문자열을 포함한 구문을 확인했다
•
native 키워드?
◦
Java에서 '네이티브 메소드'를 나타냄
◦
Java가 아닌 다른 프로그래밍 언어, 주로 C나 C++로 작성되어 있으며, Java Native Interface(JNI)를 통해 Java 코드 내에서 호출됨
◦
함수 명명법
▪
Java_<패키지명>\<클래스명>\<함수명>
조건문 만족을 위해서는 a() 메소드의 반환값이 true여야하는데, a() 메소드는 bar() 메소드의 결과를 반환하고 있기 때문에 <span style="color: red">bar() 메소드의 분석이 필요하다</span>
그러나 bar()메소드는 네이티브 메소드이기 때문에 현재 상태에서는 분석이 어렵다
1-1) 정적분석 준비
•
정적분석을 위해선 분석할 파일이 필요하다
•
파일 추출을 위해 기존 apk 파일을 zip 파일로 변환, 압축을 해제한다
•
소스코드가 저장되어있는 lib 폴더 중에서 NOX 의 CPU/ABI(Application Binary Interface) 유형과 일치하는 x86 폴더 소스코드를 확인해야한다
◦
CPU/ABI 유형 확인
분석 대상 파일 확보완료
2) 정적분석 시작 (IDA)
IDA 에서 우리가 분석하고자 하는 코드를 찾았다
해당 부분 분석 시작
아래 조건문에서 v3와 s2의 값을 처음 23개 까지 비교하여 일치한다면 result 값을 1로 설정해주고 있음을 확인할 수 있다
•
strncmp : 두 문자열을 비교, 같으면 0을 반환한다
◦
여기서는 '!' 연산자를 이용하여 true(1)가 되도록하여 if 문을 만족시키도록 하였다
이때 상단을보면 데이터가 쌓이는 것을 확인할 수 있고, 어셈블리어에서 문자는 Null byte를 만나기 전까지 하나의 문자열이다
특정 보안 값(__readgsdword) 을 사용한 v12를 제외한 <span style="color: red">s2 ~ v11은 하나의 문자열이라는 것</span>
각 데이터의 값을 확인
대부분의 x86 아키텍처는 메모리에 리틀 엔디언 방식으로 데이터를 저장한다
따라서 해당 문자열을 빅 엔디엔 방식으로 변환하면<br>
"Thanks for all the fish" 라는 문자열을 얻을 수 있다
3) 결과 확인
•
해당 문자열을 입력하여 키 값이 맞는지 확인한다
•
Success! 알림창을 확인할 수 있었다!
jadx-gui를 사용하여도 확인할 수 없는 소스코드가 있는 경우 IDA 를 사용한 어셈블리어 분석을 통해 키 값을 획득할 수 있었다