http://codeengn.com/challenges/smartapp/02 


정적분석을 위하여 위의 코드엔진 문제중 smartapp/02를 통해 분석을 해보겠다. 

그리고 이 포스팅은 전에 있던 포스팅에 설정된 것을 그대로 하니까 전 포스팅부터 읽으면 잘 될 수 있을 것이다.

02.zip



Geny Motion으로 먼저 어떤 앱인지 확인 해볼려고 한다.

그런데 시작부터 막힌다! 보통 지니모션을 사용한다면 드래그앤 드롭으로 바로 설치가 되어야 한다.

하지만 필자가 할 때 그냥 sdcard에 저장을 시켜버리고 설치를 안한다... 아래처럼

Files successfully copied to:/sdcard/Download/




그래서 확장자를 02.apk로 바꿔 드래그 앤 드롭해보니 아래와 같은 에러를 뿜으면서 안된다.

An Error occured while deploying the file. 30%




그럼 sdcard/Download/로 옮겨졌으니까 거기서 설치하면 될까 싶어서 해보았다.

app not installed라는 에러를 또 뿜으면서 안된다..하...

※여기서 File Manager로 파일 확장자 수정하는 방법은 Filezila를 통하여 수정하였다. Filezila를 사용하는 방법은 전 포스팅을 보면 될 것이다.



그래서 이번엔 adb로 설치를 해보았다.

오류를 보아하니 INSTALL_PARSE_FAILED_NO_CERTIFICATES라는 것을 확인했다.

CERTIFICATES는 인증서 관련인데 아마 앱에 인증이 안되어 있다고 볼 수 있다.



그래서 앱에 인증서를 추가했다.



C5-apk-sign.zip

앱(어플)에 인증을 추가하는 방법은 위 파일을 다운받아 풀고 폴더에 인증하고 싶은 앱을 넣고 위와 같은 명령어를 치면 된다.

Java -jar signapk.jar testkey.x509.pem testkey.pk8 2.apk 2(sign).apk

              [원본] [인증된 apk]




그리고 다시 adb install 2(sign).apk로 설치하니 됐다.




그럼 Findkey2가 설치된 것을 확인 할 수 있다.




FindKey:)  키를 찾으래요 



그럼 이제 Key를 찾아보자!

아까전에 받았던 apk를 .zip으로 바꿔 압축풀기를 해보자


그랬더니 XML파일과 DEX파일이 나왔다.


하지만 우리는 하나더 풀것이다.



apktool d 2(sign).apk



apktool로 디컴파일 한것에는 smali와 yml 파일을 볼 수 있다.

그냥 압축해제한 파일과는 좀 다르게 생긴 것을 알 수 있다.

그래서 압축해제한 파일과 apktool로 디컴파일한 파일을 가지고 분석해볼 것이다.




그리고 압축해제한 폴더에 classes.dex파일이 있는데 이것을 dex2jar로 푼다.



jar파일이 나온다.



여기서 JD-GUI를 사용하여 열면 아래와 같이 볼 수 있을 것이다.





아래 내용은 apktool로 디컴파일했던 xml이다. 압축해제한 xml은 보이지 않는다.

activity에 보면 MainActivity가 시작되는 것을 볼 수 있다.

※Activity, Service, Broadcast Receiver(방송수신자), Content Provider(콘텐츠 제공자)[인스턴스화 할 수 있는 4가지 컴포넌트로 구성]

Application은 이들 중 일부만 가질 수도 있고 여러 개를 가질 수도 있다.



다시 JD-GUI로 돌아와서 MainActivity를 찾아본다. 

MainActivity를 보니 하단에 있는 KeyString이 눈에 띄고 그 위에 if((makedate()=="2013-11-02-12:35:03") && (Volume() ==53)) 문장이

아주 아주 아주 핵심이 될거 같은 느낌이 많이 든다.



그럼 이제 smali를 보자

아까 apktool로 디컴파일한 곳에서 MainActivity.smali를 찾는다.


찾고나서 2013을 찾아보면 v1변수에 2013-11-02-12:35:03이 저장되어 있는 것을 볼 수 있고

그 아래에 

if-ne v0, v1, :cond_0

를 볼 수 있다.

if-ne v0, v1 :cond_0의 뜻은

v0과 v1이 틀리면 cond_0으로 jump 해야한다.


Cond_0으로 가면 return-void로 끝나게 된다.

Cond_0으로 틀리면 가니까 무조건 맞게하면 안 넘어 갈 수 있다.

따라서

if-ne v0, v1, :cond_0을

if-eq v0, v1, :cond_0로 바꾼다.


if-eq v0, v1 :cond_0은

v0과 v1이 같으면 cond_0으로 jump 해야한다.

로 해석 할 수 있으니까 말이다.




그럼 아까 if문에서 앞에껄 처리 했으니 뒤에 있던 volume==53 값을 보아야한다.


smali 코드에서는 16진법으로 나타나 있기때문에 0x35를 찾는다.

여기도 if-ne v0, v1, :cond_0 되어있다.

다르면 cond_0으로 넘어가게 되어 있으니 같으면 cond_0으로 넘어가게 한다.

volume값을 바꾸던지 if-ne을 바꾸면 된다.

필자는 if-ne를 바꿀 것이다.




바꾼 것을 저장하고 이제 다시 컴파일 해줄 차례이다. 디 컴파일된 경로로 가서

(임의로 '2(sign decom)'을 '2'로 바꿨다)

apktool b 2 -o 2(fix).apk

그러면 apk 파일이 나오는 것을 알 수 있다.




위 apk파일을 바로 옮겨서 실행해보면 안된다.

왜나면 아직 인증을 하지 않았기 때문이다.

아까 초반에 인증했던 것 처럼 인증을 해줘야 한다.





이제 해보자 만약에 꼬이는 걸 방지하기 위해 최초에 깔아뒀던 FindKey를 지우고 설치한다.



그리고 실행해보자!

확인 했을 때 키가 나오는 것을 알 수 있다.






앱 정적분석할 때 Smali Code와 java source로 분석했다.

만약 Smali Code만 가지고 분석할려면 시간이 많이 걸릴 것이다. 

따라서 다른 곳에서 정보를 많이 얻어서 찾으면 좀 더 수월해 보인다.

안드로이드는 정말 환경에 영향을 많이 받는 듯 싶다. 업데이트만 하면 안되고 분명히 저번엔 잘 됐는데 환경은 안바뀌고

시간만 지났는 데도 안되고 정말 예민한 친구인듯 하다...

이번 문제는 쉬우고 직관적으로 보였기 때문에 빨리 찾을 수 있었는데 어려운 문제나 실제로 쓰는 앱을 분석할려면

Java 언어에 대한 이해가 많이 필요해 보인다.

그리고 어플은 단지 소스만 바꾸는게 아니라 인증 과정까지 거쳐야 사용 할 수 있다. 









+ Recent posts