Computer Science%/Mobile App

안드로이드 연결하기 및 메모리 덤프하기 - 1 (feat. adb & frida & fridump)

ch4rli3kop 2018. 1. 25. 00:51
반응형

이번 글의 최종목표는 안드로이드 메모리를 덤프하는 겁니다. 물론 곁다리로 안드로이드의 깊숙히 숨겨져있는 면까지도 접근할 수 있겠습니다만, 주 목적은 fridump 라는 도구를 이용해서 안드로이드 어플 사용시 사용자가 입력한 데이터들이 메모리에서 잘 발견이 되는지를 판단하는 것이겠습니다. 한 번에 정리하기에는 글이 너무 길어질 것 같아, 적당히 두 번에 걸쳐 정리하도록 하겠습니다.


먼저, 1 장에서는 adb를 설치해서 안드로이드와 사용자의 PC 간의 연결을 돈독히 하도록 만들어주고, frida 를 설치해서 fridump라는 메모리 덤프 도구를 사용할 기반을 만들어주도록 하겠습니다.


주의 : 루팅이 되지 않은 단말은 fridump 로 덤프할 수 있는 메모리 영역이 극도로 줄어듬을 확인하실 수 있습니다.


시작하겠습니다. 먼저 adb 를 설치해봅시다. adb에대한 설명은 아래를 참고하시길 바랍니다.

adb 란? 

Android debug bridge 라는 것의 약자인데, 안드로이드 디바이스와 통신이 가능하도록 해주는 도구입니다. 이 도구를 이용하여 PC에서 안드로이드에 접속하여 원하는 작업을 수행하도록 할 수 있습니다. 요즘에는 스마트 폰과 연결하면 자동으로 드라이버를 설치해줘서 PC에서 스마트 폰에 접근할 수 있지만, adb는 스마트 폰의 더 깊은 곳까지 접근이 가능토록 합니다. adb는 Android SDK(Software Development Kit)에 포함되어 있습니다. 


자, 이제 이런 좋은 도구를 설치해볼 차례인데요. adb는 위에서 설명했다시피 SDK에 포함되어있는 도구입니다. 따라서 우선 SDK를 설치해보도록 하겠습니다. 다음 링크에서 SDK 에 있는 도구들을 다운받으실 수 있습니다. https://developer.android.com/studio/releases/platform-tools.html


위 링크에 들어가시면 위와 같은 페이지를 보실 수 있을텐데요. 적당히 자신의 OS에 맞는 걸로 다운로드를 해줍시다.


압축을 풀고 폴더를 확인해보니, adb가 환영해주는 모습을 보실 수 있습니다.


adb가 준비되었으면 이제 디바이스에서도 설정을 해주어야 할 것이 있습니다. 바로 개발자 옵션의 USB 디버깅 항목을 체크해주셔야 하는데요. 일단 개발자 옵션이 숨겨져있어 그것부터 찾으셔야 합니다. 보통 개발자 옵션은 스마트 폰의 옵션 창에 들어가, [휴대폰 정보 -> 소프트웨어 정보 -> 빌드 번호] 에 있는 빌드 번호를 우다다다!! 계속 누르시면 언젠가 나옵니다 ㅎ. 그렇게 개발자 옵션에 들어갈 수 있게 되면, 다음과 같이 USB 디버깅 항목을 체크해주셔야 합니다.

체크까지 해주면 이제 adb를 실행할 차례인 것 같네요! (아래의 모든 작업들은 디바이스가 켜진 상태로 진행됩니다!)


적당히 잘 설치된 adb 를 실행해서 기기와 잘 연결이 되었는지 확인해봅시다. 아, adb는 Command Line 도구입니다.
cmd에서 실행하셔야 합니다.


cmd를 실행하고, adb를 실행합니다. 

>> adb devices

저는 환경변수에 적당히 adb를 등록해놓아서 바로 사용했습니다. 편하게 사용하실 분들은 adb를 환경변수에 등록해 놓으시고, 그것도 귀찮다 하시는 분들은 그냥 adb 가 설치되어있는 폴더 위치에서 cmd 를 사용하시면 됩니다.



adb 명령어를 실행하시면 스마트 폰에서 접속을 허락 어쩌구하는 경고 창이 뜰텐데, 그 때 수락을 해주시면 됩니다. 위와 같이 devices attached list에 해당 기기의 이름이 뜨면 연결이 잘 된겁니다. 만약 authentication이 잘 되지않았다거나 하는 것과 같이 문제가 생겼다면, 해당 기기의 드라이버를 PC에 설치해주시기 바랍니다.


근데 사실 이 부분이 제일 오래걸리는 부분인 것 같습니다. 이 글을 쓰는 저도 맞는 드라이버를 찾느라 일주일을 소비했습니다. 일주일동안 LG 욕만 한 것 같습니다. 삼성 폰 사용하는 애들을 그렇게 부러워했던 적이 없었던 것 같습니다.. ㅠ LG 홈페이지에서 해당 폰의 드라이버라고 제공하는 모든 드라이버들을 버전별로 설치하고 삭제하고 해봤지만, 되지않았습니다. 결국 반쯤 자포자기하는 심정으로 소프트웨어를 업그레이드하려, LGMobile Support Tool 을 실행했더니 자동으로 드라이버를 잡아서 설치해주더라구요. 그랬더니 됐습니다..! :ㅁ (참고로 저는 G3 beat를 대상으로 진행했습니다.) 혹여나 저같이 고생하신 분들이 ...꼭꼭꼭 있었으면 좋겠네요!ㅎ 쿠헬헬  아무튼 저렇게 하면 잘 됩니다!  :)  


말이 길어지네요. 쌓인게 많아서 그렇습니다. (흑)


이제 준비는 끝났습니다. 계속 진행합시다. adb로 디바이스 안을 탐사해봅니다.

"adb shell" 명령어를 이용하면, 특정 명령어를 실행하거나 디바이스에대한 shell 창을 띄울 수 있습니다. 이 shell을 이용해서 안드로이드 기기에 접속해 봅시다.


su 를 이용하면 Root 권한을 획득하게 되어 훨씬 많은 곳에 접근할 수 있습니다.

*주의 : 루팅이 되지 않은 단말은 su를 사용하실 수 없습니다. 안드로이드의 중요한 곳들은 대부분 접근하실 수 없을겝니다.*


adb shell 사용하시면, 요렇게 디바이스 이곳저곳에 기웃거리는 등 리눅스처럼 편하게 작업하실 수 있습니다. (안드로이드가 리눅스 커널을 기반으로 만들어졌기 때문입니다.)


물론 먹히는 명령어는 많지 않을 겁니다.(웃음) 그럴 때는 BusyBox 라던가 하는 어플리케이션을 이용해서 안드로이드 기기 내에 명령어들을 설치해주시면 됩니다.



말이 조금 많이 샜는데, 아무튼 짱짱한 adb shell 명령어를 살펴보았습니다. adb 명령어에 대한 설명은 검색하면 많이 나오니 적당히 검색을 이용하시면 될 것 같습니다. 이제 fridump를 사용하기 위해 frida 설치로 넘어갑시다.


frida 란?

frida는 DBI(Dynamic Binary Instrumentation)이라고도 하는 동적 바이너리 조사를 가능하게 해주는 도구입니다. Windows, MacOS, GNU/Linux, Android, iOS 등에 기본적으로 있는 어플리케이션의 바이너리에, 사용자의 자바스크립트 snippets(코드 모음)이나 라이브러리를 Inject 할 수 있는 기능이 있는데요. 이런 기능들을 가진 frida 뿐만 아니라 frida API 로 만들어진 몇몇 도구들을 이용해서 바이너리를 조사할 수 있습니다. 



우선 PC에 위와 같은 짱짱한 frida를 설치해보도록 하겠습니다. adb shell에서 빠져나오시고 평범한 윈도우 cmd 창에서 다음과 같이 명령어를 사용하시면 됩니다.

>> pip install frida-server==9.0.0

정식 홈페이지에서 공지하는 "sudo pip install frida"로 설치해도 무방합니다만, 제 경우에는 오류가 발생하더군요..ㅜ 아무튼 적당한 방법으로 frida를 설치해줍니다.


PC에서 frida 설치가 끝났으면, 이제 디바이스에 frida-server 바이너리를 넣어주어 실행시킵시다. (frida 를 사용하려면 디바이스에 server 를 올려야 합니다.) 다음 링크에서 frida-server 파일을 받으실 수 있습니다. https://github.com/frida/frida/releases


압축을 풀면 frida-server 바이너리 파일을 얻으실 수 있으실텐데요. 이제 이 바이너리 파일을 adb를 이용하여 디바이스 안에 넣어주고 백그라운드로 실행시켜 보도록 하겠습니다.


adb에는 push와 pull이라는 명령어가 있는데요. 딱 느낌상 알 수 있듯이 push하면 디바이스 안에 파일을 밀어 넣을 수 있고, pull하면 디바이스 안에 존재하는 파일을 PC 상으로 뽑아낼 수 있습니다. push 기능을 이용하여 frida-server 파일을 디바이스의 /data/local/tmp 안에 집어넣겠습니다.


평범한 윈도우 cmd 창에 다음과 같이 명령어를 사용합시다. (adb shell 상에서 하면 안됩니다!)

>> adb push D:\AppTest\frida-server /data/local/tmp

"adb push [넣을 파일 위치] [파일 들어갈 곳]"요렇게 사용하시면 됩니다. 

파일이 성공적으로 전송이 완료되었으면 위와 같이 파일이 전송되었다는 흔적을 보실 수 있으실겝니다 :D


이제 adb shell로 접속해서 보낸 파일을 디바이스에서 백그라운드로 돌립시다!

먼저, /data/local/tmp 디렉토리로 이동합니다.


frida-server 가 보이죠? 잘 전송이 되었습니다! 짝짝 (저기 re.frida.server는 frida-server를 실행하면 생기는 디렉토리입니다. 신경 ㄴㄴ입니다.) 자, frida-server의 안위까지 잘 확인하였으니 실행권한을 주고 백그라운드로 실행시킵시다! 

아 맞다, 루팅이 되지 않은 폰에서는 실행권한을 주지 못하던가 아니면 파일을 실행시킬 수 없을 겁니다. 루팅이 되지않은 폰은 다른 방법으로 메모리 덤프를 수행해야해요 ㅠ 암튼 계속 ㄱㄱ 합시다.


(따봉)


ps 명령어로 확인해봐도 frida-server가 잘 돌아가고 있는 것을 확인할 수 있습니다.


마지막으로 이때까지 제대로 되었는지 확인해보는 명령어가 있습니다. adb shell 상에서가 아닌 cmd 창에서 진행하는데요.

>> frida-ps -U

위 명령어를 얍! 하고 써보면 다음과 같이 촤라락! 한 화면을 보실 수 있습니다!


짝짝! 이제 안드로이드 디바이스에서 처리되고 있는 프로세스 목록을 PC에서 확인할 수 있게 되었습니다~! :D

이제 fridump를 이용해서 메모리 덤프를 수행할 준비가 완료되었습니다! 다음에는 메모리 덤프를 수행합시다!


위의 수행한 내용들은 요기를 참고하셔도 좋을 것 같습니다. frida 공식 홈페이지 입니다.

https://www.frida.re/docs/android/



PS : 글을 내릴수록 미묘한 온도 차가 느껴지는 것은 글쓴이가 조울증이라던가 이중인격이라서가 아닙니다. 그냥 한나절동안 계속 놀면서 써서 그래요!



반응형