본문 바로가기

카테고리 없음

jadx, apktool을 이용한 루팅, 무결성 검사 우회하기 - 2

안녕하세요 저번 루팅 우회에 이어 오늘은 무결성 검사 버튼을 우회해 보도록 하겠습니다.

 

저번과 비슷한 과정을 통해서 무결성 검사 우회도 진행해 보도록 하겠습니다.

 - Nox 환경에서 앱을 실행시켜 어떻게 동작하는지 파악

 - jadx를 통한 코드 흐름 파악 (무결성 검사 파악)

 - smali 분석 및 변조 (무결성 검사 우회)

 - 변조된 앱 리패키징 및 Nox 환경에서 실행

 

1. Nox환경에서 앱 실행 및 현상 파악

Step 1) 저번에 루팅검사를 우회한 앱을 실행시킵니다.

 

Step 2) Integrity Check 버튼을 클릭하고 어떻게 반응하는지 확인합니다.

앱이 그냥 꺼지는 것을 확인할 수 있습니다.

 

2. jadx를 통한 코드 흐름 파악

Step 1) jadx로 저번에 디버깅 했을 때 나온 app-release 폴더를 열어봅니다.

 

Step 2) 저번에 Splash Activity에서 분석을 했었죠? 그 경로로 이동해서 코드를 분석해 봅니다.

저번에 저희가 smali 코드를 else로 무조건 넘어가게 변경해서 앱이 종료되지 않고 다음 화면으로 넘어갔었죠?

그렇다면 else 코드를 분석해서 다음으로 넘어가는 코드를 찾을 필요가 있어 보입니다.

SplashActivity.onCreate$lambda$0이라는 메서드가 보이는 것을 알 수 있습니다.

해당 메서드가 어디 있는지 한번 확인해 볼 필요가 있습니다. onCreate$lambda$0를 더블 클릭 해줍니다.

해당 메서드를 분석해 봤을 때 MainActivity를 시작하고 현재 splashActivity는 종료하는 것을 알 수 있습니다.

즉, 메인 화면을 실행하고 스플래시 화면을 종료해서 화면 전환을 한다고 볼 수 있죠.

 

그렇다면 저희는 MainActivity를 분석해 볼 필요가 있습니다.

 

Step 3) MainActivity로 이동해서 코드를 분석해 봅니다.

아까 앱을 실행했을 때 버튼이 두 개가 있었죠? (Rooting Check, Integrity Check)

MainActivity 코드를 분석해 봤을 때 Button이 두 개가 있는 것을 확인할 수 있습니다.

button2를 잘 보면 버튼이 클릭되는 이벤트가 발생할 시 실행되는 리스너 코드가 있는 것을 확인할 수 있습니다.

그 안에 onCreate$lambda$3이라는 함수가 있는데 이것이 무결성 검사 버튼과 연관이 있어 보입니다.

 

코드를 분석할 필요가 있어 보이니 더블클릭해서 함수로 이동해 줍니다.

코드를 분석해 보면 str과 getAppSignatureHash 함수의 결과 값을 비교했을 때 같지 않다면 앱을 종료한다는 것을 알 수 있습니다.

str의 값은 하드코딩 된 것을 알 수 있습니다.

 

getAppSignatureHash를 번역해 봤을 때 애플리케이션의 애플리케이션의 서명 키를 해시화해서 나온 값을 str과 비교하는 것을 알 수 있습니다.

 

저번에 저희는 keytool 명령어를 통해서 서명 키를 자체적으로 만들어서 정상 앱일 때 가지고 있던 서명 키와는 다르게 되어 종료가 되었던 것입니다.

 

무결성을 우회하기 위해서는 두 가지 방안이 있습니다.

 - getAppSignatureHash 함수가 하드코딩 된 Hash 값을 무조건 반환하게 만든다.

 - if문의 참 거짓 여부와는 상관없이 무조건 else 쪽으로 가게 만든다.

 

저희는 이번에도 2번째 방안으로 해보도록 하겠습니다.

 

3. smali 코드 분석 및 변조

Step 1) 에디터 프로그램으로 app-release 폴더를 열고 다음의 경로로 이동해 줍니다.

 - smali > com > example > myapplication > MainActivity.smali

 

Step 2) if문이 있었던 onCreate$lambda$3 메서드를 찾아 코드를 분석합니다.

코드를 보시면 jadx에서 봤었던 함수들이 보인다는 것을 알 수 있습니다.

특히 areEqual 함수가 호출되어 p0에 값이 저장된다는 것을 볼 수 있습니다.

그리고 if-nez p0, :cond_0 부분이 서명키가 같은지 아닌지 비교하는 부분임을 추측할 수 있습니다.

그리고 :cond_0가 startActivity를 실행하는 코드가 있다는 점과 :cond_0가 아닌 영역에 finish 함수가 있다는 것을 봤을 때

코드의 흐름이 :cond_0로 넘어가게 수정해야 무결성 우회가 가능할 것으로 판단됩니다.

 

현재 if-nez p0가 거짓이라 finish 함수가 호출되는 것을 알 수 있습니다.

이를 반대의 개념 즉, if-eqz p0로 수정해 주겠습니다.

 

Step 3) if-nez p0 코드를 if-eqz p0로 수정하고 저장합니다.

 

4. 변조된 앱 리패키징 및 Nox 환경에서 실행

Step 1) cmd를 열고 앱이 다운로드된 경로로 이동하고 다음의 명령어로 빌드를 해줍니다.

 - apktool b app-release

 

Step 2) app-release\dist\app-release.apk가 정상적으로 생성되었는지 확인합니다.

 

Step 3) cmd에 다음의 명령어를 통해 생성된 앱에 저번에 만든 서명 키로 서명해 줍니다.

 - apksigner sign --ks Mykey.keystore --ks-key-alias my-key-alias --out signed2.apk app-release\dist\app-release.apk

 

Step 4) 앱이 설치된 경로로 이동해서 signed2.apk 파일이 생성되었는지 확인해 줍니다.

 

Step 5) signed2.apk를 Nox로 드래그 앤 드롭을 해줘서 설치하고 앱을 실행합니다.

 

Step 6) Integrity Check 버튼을 클릭합니다.

 

이렇게 무결성 우회도 성공적으로 할 수 있었습니다.

 

모바일 취약점 점검을 할 때는 이렇게 루팅 검사와 무결성 검사로 인해 앱이 실행이 안 되는 경우가 있습니다.

그래서 지금까지 했던 과정처럼 루팅과 무결성 검사 우회를 우선적으로 실시하고 이후 웹이면 웹 취약점을 점검하듯 하면 되고 게임이면 게임 취약점 점검을 하듯이 진행하면 됩니다.

 

지금까지 고생 많으셨습니다.

 

추가적으로 루팅 검사 버튼인 Rooting Check 버튼을 클릭하면 앱이 꺼질 것입니다.

Rooting Check 버튼을 통한 루팅 검사 우회는 한번 직접 코드 분석을 해서 연습해 보시길 바랍니다.

 

긴 글 읽어주셔서 감사합니다.