문제 : https://github.com/OWASP/owasp-mstg/tree/master/Crackmes
문제를 보면 앱 어딘가에 secret string이 있다고 한다. 그것을 추출해낼 방법을 찾아보라고 한다.
루팅폰에서 앱 설치 후 실행시키면 아래와 같은 메시지가 뜨며 OK를 누를 시 앱이 종료된다.
따라서 이를 분석하여 루팅탐지부터 우회해야 한다.
Launcher Activity의 onCreate에 가면 루팅탐지 시 나타난 "Root detected!"라는 문구가 하드코딩되어 있는 것을 볼 수 있다.
따라서 c.a() , c.b(), c.c() 함수에 뭔 짓(?)을 하면 될거라 생각된다.
간단하게 smali 코드에서 if문을 반대로 동작하도록 하면 풀릴 거라 생각하고 if-nez 두개를 if-eqz로 바꿨다.
하지만 풀리지 않았다.
루팅폰의 경우 3가지 조건에 다 걸릴 수도 있지만 1개만 걸릴 수도 있기 때문에 log를 출력시켜 걸리는 함수만 조건문을 반대로 작동하게 하기로 하였다.
각 조건문에 log를 출력하도록 아래와 같이 smali 코드를 작성하였다. (v1 부분의 문자열만 first, second, third로 변경하였다.)
const-string v1, "first"
const-string v2, "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
invoke-static {v1,v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
그 결과 로그캣으로 봤을 때 하나도 보이지 않아 먼저 첫번째 조건문을 우회해야겠다 생각하였고 첫번째 조건문만 if-nez를 if-eqz로 바꾸고 다시 묶어 실행시키고 로그캣으로 봤다.
위와 같이 출력이 되며 루팅탐지가 우회되어 잘 접근되었다.
들어가면 아래와 같이 Secret String을 입력하라는 창이 뜬다.
임의의 문자를 입력하면 Nope... 이라는 메시지가 뜨는데 이를 코드에서 확인해보면 verify 라는 함수에 있는 것을 볼 수 있다.
조건 문이 if(a.a(v0)) 가 되면 Success가 뜨는 것으로 보아 a.a 함수를 확인해보면 답이 될 듯 하다.
a.a 함수에 따라 들어가면 입력한 문자열과 sg.vantagepoint.a.a.a 함수에 문자열 2개를 넣은 것과 비교를 한다.
따라서 sg.vantagepoint.a.a.a에 따라 들어가면 AES 암호화 혹은 복호화와 관련한 것이 보이는데 그 결과를 return시키고 있다.
따라서 smali 코드에 해당 리턴값을 출력시키면 답이 될거라 생각하였다.
아래와 같은 smali코드를 return 전에 입력해주었다.
const-string v3, "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
new-instance v4, Ljava/lang/String;
invoke-direct {v4,v0}, Ljava/lang/String;-><init>([B)V
invoke-static {v3,v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
간단히 설명하면 v4를 새로 생성해준 뒤 리턴값이 들어있는 v0를 v4에 넣어주고 해당 값을 로그에 찍어주었다.
로그에 보이는 I want to believe를 입력하고 검증 버튼을 누르면 문제 해결!
'Hacking > Mobile' 카테고리의 다른 글
[아이폰] 아이폰5(IOS 10.3.3) 탈옥 및 진단환경 세팅 (1) | 2018.04.02 |
---|---|
[OWASP] UnCrackable App for Android Level 2 (feat. IDA 동적디버깅) (0) | 2018.02.27 |
[2016-SU-CTF] Android 100 (0) | 2018.02.13 |
[2014_SU_CTF] Commercial Application ( Reverse 200 ) (0) | 2018.02.13 |
IOS 진단 시 Burp 인증서 신뢰하기 (0) | 2018.02.12 |