http://codeengn.com/challenges/smartapp/02
정적분석을 위하여 위의 코드엔진 문제중 smartapp/02를 통해 분석을 해보겠다.
그리고 이 포스팅은 전에 있던 포스팅에 설정된 것을 그대로 하니까 전 포스팅부터 읽으면 잘 될 수 있을 것이다.
02.zipGeny 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는 인증서 관련인데 아마 앱에 인증이 안되어 있다고 볼 수 있다.
그래서 앱에 인증서를 추가했다.
앱(어플)에 인증을 추가하는 방법은 위 파일을 다운받아 풀고 폴더에 인증하고 싶은 앱을 넣고 위와 같은 명령어를 치면 된다.
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 언어에 대한 이해가 많이 필요해 보인다.
그리고 어플은 단지 소스만 바꾸는게 아니라 인증 과정까지 거쳐야 사용 할 수 있다.
'Android' 카테고리의 다른 글
ADB error: more than one device and emulator 해결법 (2) | 2016.09.17 |
---|---|
Burp Suite를 이용한 안드로이드에서 앱 데이터/패킷 캡쳐, 변조 (1) | 2016.09.02 |
ddms을 이용한 안드로이드(Android) 앱 메모리 덤프 뜨기 (1) | 2016.08.30 |
안드로이드 앱 정적분석 방법 (1) (0) | 2016.08.24 |
안드로이드 스튜디오, 지니모션을 통한 앱분석 환경 만들기 (2/2) (0) | 2016.08.24 |
최근댓글