외로운 Nova의 작업실

안드로이드 앱 리버싱 - 2(IDA pro 원격 안드로이드앱 리버싱) 본문

Mobile App Penetesting/Android Reversing

안드로이드 앱 리버싱 - 2(IDA pro 원격 안드로이드앱 리버싱)

Nova_ 2023. 2. 9. 21:37

- 동적 분석

저번 1장에서 안드로이드 앱을 apk > dex > .class 파일로 변경해서 자바 디컴파일로 파일을 봐보았습니다. 하지만 이는 정적 분석으로 코드만 볼 수 있습니다. ollydbg같이 프로그램을 실행시키면서 동적으로 분석하는 방법이 있는지 찾아보았습니다. IDA Pro로 가능하다는 것을 알게 되었습니다. 그 방법을 소개해드리겠습니다.

 

- 사전 준비

먼저 동적 분석을 하려면 IDA pro, 통합USB드라이버, 안드로이드 단말기, adb 프로그램이 필요합니다. IDA pro가 있으신 분들만 가능합니다. 이제 통합 USB 드리이버를 다운로드 해보겠습니다.

 

<통합 usb드라이버>

스마트폰 제조사에 맞춰 통합 usb드라이버를 다운로드해줍니다. 저의 경우에는 삼성이므로 아래의 링크에서 다운로드가 가능합니다.

https://www.samsungsvc.co.kr/download

 

다운로드 자료실 | 스스로해결 | 삼성전자서비스

다운로드 자료실 원하시는 정보를 못 찾으셨다면 아래 서비스를 이용해보세요. 문제해결이 되지 않거나 어려우시다면 인공지능 채팅 로봇으로 상담을 받아보시기 바랍니다. 무상 보증기간 이

www.samsungsvc.co.kr

 

<안드로이드 단말기>

제가 사용하던 핸드폰으로 햇으면 zfilp 1기종을 사용하겠습니다.

 

<adb>

adb는 android debugger의 약자로 컴퓨터에서 안드로이드를 디버깅할 수 있는 툴입니다. 다운로드는 아래에서 가능합니다.

https://developer.android.com/studio/releases/platform-tools?hl=ko 

 

SDK 플랫폼 도구 출시 노트  |  Android 개발자  |  Android Developers

Android SDK 플랫폼 도구는 Android SDK의 구성요소입니다.

developer.android.com

다운로드가 되셨다면 환경변수 path에 추가해주시면 됩니다.

 

- 단말기와 노트북 연결

먼저 단말기에서 usb 디버깅 옵션을 활성화 해줘야합니다. 아래 그림에따라 진행해줍니다.

이후에 컴퓨터와 단말기를 연결해주시고 컴퓨터의 명령 프롬프트 창에서 adb device를 입력합니다. 그러면 단말기에 아래처럼 뜹니다.

확인을 누르면 컴퓨터에 아래처럼 뜬다면 정상적으로 연결된것입니다.

 

- 안드로이드 서버 열기

<단말기에 서버넣기>

IDA가 원격 디버깅을 하려면 단말기와 통신해야합니다. 이때 단말기에서 서버를 열어줘야 가능한데, 이 서버는 IDA 파일안에 있습니다. IDA파일안에 dbgsrv 디렉토리에 들어가보시면 여러 서버가 있습니다.

이중에서 단말기의 cpu에 맞는 서버를 넣어줘야하는데 저는 android_server64를 넣어줬습니다. 넣는 방법은 adb를 이용하며 안드로이드의 /data/local/tmp 경로에 넣어줄겁니다. dbgsrv 경로의 cmd에서 아래 명령어로 파일을 넣어줍니다.

adb push android_server64 /data/local/tmp

이후 서버를 실행할건데, 서버 파일의 권한이 아직 없기때문에 권한을 변경해줘야합니다. 따라서 안드로이드 내부에서 권한을 바꿔줘야하기때문에 먼저 아래 명령어로 안드로이드 내부에 접속합니다.

adb shell

이후 cd 명령어로 /data/local/tmp 경로로 가준후 chmod 775로 변경해줍니다.

adb shell
/data/local/tmp$ cd /data/local/tmp
/data/local/tmp$ chmod 775 android_server64

이제 서버를 실행할 수 있습니다.

 

<서버 ip확인>

아직 서버를 실행하기전에 하나 확인해야하는게 있습니다. IDA와 단말기가 통신할때 ip를 통해서 통신하게되는데, 이때 필요한 정보가 단말기의 ip입니다. 이는 iㄹconfig 명령어로 확인할 수 있습니다.

/data/local/tmp $ ifconfig

여러개가 뜰텐데, wlan()부분을 확인해주시면됩니다.

저의 경우에는 192.168.123.101이였습니다.

<어플 디버깅 준비>

그리고 이제 핸드폰 앱을 디버깅할 준비를시켜줍니다. 저는 1장에서 만들었던 android_reverse 앱을 사용하겠습니다. adb shell am start -D -n [패키지명]/[메인액티비티 경로]를 입력하여 앱을 Debug mode로 실행시켜준다.

adb shell am start -D -n com.example.android_reverse/com.example.android_reverse.MainActivity

그러면 아래와같이 디버거 모드로 잠시 핸드폰이 멈춥니다.

<서버실행>

이제 다시 adb shell 명령어로 접속해서 tmp 경로로가서 아래 명령어로 서버를 실행시켜줍니다.

/data/local/tmp $ ./android_server64

그러면 아래와 같이뜹니다.

 

 

- IDA 접속

이제 IDA를 열고 위에 debugger>Attatch>remote ARM rinux/android Debugger를 선택해줍니다. 그리고 호스트 네임에 192.168.123.101을 입력해줍니다. 

password는 없어도되고 이후 ok를 눌러줍니다. 그럼 아래처럼 실행중인 프로세스가 뜰것입니다.

 

- 오류점

원래는 com.example.android_server가 떠야하는데 뜨지를 않습니다. 앱을 빌드할때 매니페스트파일 application태그에 아래와 같이 써줬지만

android:debuggable="true"
tools:ignore="HardcodedDebugMode"

디버깅 되지않습니다. 혹시몰라 gradle(app)파일의 buildTypes에

release {
	debuggable true
}

를 써주었지만 프로세스에 나타나지 않았습니다. 이는 핸드폰을 루팅하지않았기때문이라고 생각합니다. 다음번에 루팅된 핸드폰으로 다시한번 더 해보겠습니다.

Comments