반응형

문제 : 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를 입력하고 검증 버튼을 누르면 문제 해결!


반응형
블로그 이미지

rootable

,