Search

Key 획득 (jadx 활용 디컴파일)

카테고리
[실습] 모바일 앱 공격 위협
상태
완료
게시일
2024/05/08
태그

분석 대상 앱 설치

SmartAppL02.apk

사용한 툴

jadx-1.4.2

1) 어플 실행

어플을 NOX에 설치하여 실행해본다
바로 실패.. jadx를 사용하여 분석해본다
APK signature에서 서명 검증이 실패하고 있는 것을 확인 이전 실습에서 진행했던 방법으로 서명을 진행해준다

2) 타켓 어플 서명

java -jar uber-apk-signer-1.3.0.jar --apks SmartAppL02.apk
Shell
복사
서명 완료된 apk 파일을 설치하면 설치가 완료되며 어플을 열어볼 수 있다
어플 내용을 확인하니 FIndKey 라는 메세지를 확인할 수 있었다

3) 분석 시작

FindKey 라고 했으니 키를 찾아보자
jadx를 이용하여 디컴파일 후 원본 소스코드를 확인하여 어디서 키를 설정하고 있는지 확인한다
소스코드 확인 결과
makeDate()와 Volume() 함수를 사용하여 키를 생성하고 있다
onCreate()에서 makeDate()의 결과 값과 Volume()의 결과 값이 <span style="color: red">특정 조건을 만족할 때</span> this.aView.setText(keyString())가 실행됨을 확인할 수 있다
필요한 조건
makeDate : "2013-11-02-12:35:03"
Volum : 53

4) smali 코드와 비교 확인

Split view를 사용하여 해당 비교문에서 어떤 smali 코드를 사용하고 있는지 확인한다
line 29, line 30 부분에서 java 코드가 smali로 번역되어 있는 것을 확인할 수 있다 해당 부분을 자세히 보면

if-ne v0, v1 구문으로 비교문이 구현 되어있다

if-ne는 레지스터 v0과 v1에 저장된 값이 같지 않을 경우 (ne : not equal) :cond_2d 라벨로 분기하는 명령어이다

cond_2d 라벨 확인

해당 라벨을 확인해보니 return-void가 되고 있음을 알 수 있다
즉, 해당 라벨로 점프하면 아무것도 실행되지 않는다 (조건을 만족해야한다) 는 것

5) smali 코드 수정

vs 코드로 jadx로 찾은 부분의 폴더를 여러 수정을 진행한다
점프를 해버리면 return-void가 되버리기 때문에 점프를 하면 안 된다. v0과 v1를 비교하지 않고 v1과 v1를 비교해버리면 항상 참으로 점프를 하지 않게 될 것이다

6) 결과 확인

위와 같이 수정 후 저장
리빌딩, 서명을 진행 한 후 NOX에 어플을 다시 설치하여 실행해본다
새 파일은 SmartAppL03.apk 으로 만들 예정
apktool.bat b SmartAppL02 -o SmartAppL03.apk java -jar uber-apk-signer-1.3.0.jar --apks SmartAppL03.apk
Shell
복사
최종 키 값을 확인할 수 있었다!