- clutch, IDA, gdb 등을통한앱분석 - 2014. 6 코드분석팀이동은 delee@kisa.or.kr 본보고서의전부나일부를인용시, 반드시 [ 자료 : 한국인터넷진흥원 (KISA)] 를명시하여주시기바랍니다.
[ 목차 ] 1. 개요 2 2. ios 앱정적동적분석 3 3. 아이패드탈옥 9 4. 공유기등을이용한원격파일송수신및디버깅환경구성 11 5. ios 용 GNU Debugger(iOS 5&6) 설치 13 6. 동적디버깅및소스수정을위한 Cycript 설치 14 7. 아이패드앱구성 15 8. 바이너리 ( 클래스 ) 파일리버싱 16 9. 암호화된앱크랙방법 18 10. 크랙된앱설치 23
1. 개요 세계보안회사 F-Secure가발표한자료에따르면 2014년 1분기 277개새로운보안위협중 99% 이상 (275개) 이안드로이드플랫폼에서발생하였으며각각한개위협만이 iphone 과심비안플랫폼에서발생하였다 [1]. 그러나 ios 플랫폼에서악성코드가전혀발생하지않은것은아니며, 2012년애플社정식앱스토어에서사용자의주소록을탈취하는 Find and Call 악성앱이유포되었다. < Find and Call 앱 > 최근에는라이브러리 (.dylib) 형태로 SSLWrite 함수를후킹하여앱스토어에전송 되는애플아이디와패스워드를원격서버로탈취하는악성코드가탈옥된 ios 에서 발견되었다. < SSLWrite 함수후킹모듈 > - 2 -
< 애플아이디및패스워드유출모듈 > 이처럼아이폰및아이패드는정식앱마켓을통해코드사이닝이된앱만설치가능하여안드로이드와달리스미싱등을통한유포가힘들다. 그러나탈옥된아이폰, 아이패드의경우, 운영체제가리눅스에기반하고있어 gdb, perl 등일반프로그램을 ios 버전으로그대로사용가능하여안전지대라고확신하기는이르다. 2. ios 앱정적동적분석 ( 테스트환경 : ios 5.1.1 가설치된아이패드 1) 본보고서에서는 ios 에서악성앱이유포되었을때활용할수있도록 ios 앱 정적동적분석방법을설명하고자한다. 그예시로국내에서널리사용중인앱을 선택하였다. 분석결과, 앱내부바이너리파일은암호화되어있었으며 clutch 공개 툴 1) 을통해복호화가가능하였다. IDA 분석프로그램은해당파일을 Mach-O 포 맷으로인식하여 Objective-C 코드로보여준다. Mach-O : 카네기멜론대학에서개발한 Mach 커널에서동작하는실행파일포맷 clutch : 암호화된어플을복호화해주는툴 Objective-C : 애플의 Mac OS X 10 및 ios 에서사용되는객체지향언어 < 암호화된앱 > < clutch 를통해복호화한앱 > 1) clutch 설치방법은 9. 암호화된앱크랙방법 (18 페이지 ) 참조 - 3 -
국내특정앱은실행시탈옥된단말기인것을탐지하여다음과같은팝업창을보여준다. 해당팝업창을띄우는모듈을확인하기위해복호화한클래스파일을 IDA 프로그램에서분석하였다. < 탈옥된단말기탐지 > 클래스파일내에서 ERRCODE 문자열로검색하면 AlertView 클래스를이용해 팝업창을생성하는모듈이보인다. 모듈시작부분을살펴보면앱제작자가생성한 ResultsetForSanne 클래스의 shared 함수가호출되는것을볼수있다. < 정적분석 : ERRCODE 문자열을통해알림팝업을띄우는모듈 > - 4 -
일반적으로앱이심볼테이블이포함된상태에서컴파일되었다면 gdb에서 break [ResultsetForSanne shared] 명령어로브레이크포인트설정이가능하다. 그러나현재 Release버전으로배포되어심볼테이블이포함되지않은것으로판단된다. 그러나 cycript 2) 를이용하면일부함수들의주소를확인할수있다. cycript p [PID] 를실행한후 ResultsetForSanne->isa.messages 라고실행하면함수주소가 0x618c1 인것을확인할수있다. cycript : ios 및 Mac OS X에서실행중인어플을수정하거나탐색하도록지원하는툴 < 동적분석 : Cycript 를통한함수위치확인 > gdb 3) 실행시키고 attach [ 앱클래스이름 ] 을통해동적분석을시작한다. < 동적분석 : gdb 실행및앱 attach > 2) cycript 설치방법은 6. 동적디버깅및소스수정을위한 Cycript 설치 (14 페이지 ) 참조 3) ios 용 gdb 설치방법은 5. ios 용 GNU Debugger(iOS 5&6) 설치 (13 페이지 ) 참조 - 5 -
cycript를통해확인한 ResultsetForSanne 클래스, shared 함수주소에브레이크포인트를둔다. c를통해프로그램을실행시키면실제해당모듈에서멈추는것을확인할수있다. < 동적분석 : 함수주소에브레크포인트설정 > IDA 에서 ERRCODE 문자열이저장될것으로추정되는 initwithtitle:message:delegate: cancelbuttontitle:otherbuttontitles: 을확인한후브레이크포인트를설정한다. < 동적분석 : initwithtitle:message:delegate:cancelbuttontitle:otherbuttontitles: 에브레이크포인트설정 > 다시 c 명령을통해프로그램을실행시키고레지스터 $r3 를확인하면팝업창알림 메시지가동일한것을확인할수있다. < 동적분석 : 알림팝업메시지확인 > - 6 -
해당앱이저장된폴더에는탈옥관련프로그램 (Cydia 등 ) 및 ios 용악성코드 (Find and Call 앱등 ) 목록이저장된파일 (filetocheck.plist) 이존재한다. < filetocheck.plist 코드확인 > IDA 에서살펴보면 FileChecker 클래스의 getplistfileindocumentfolder 함수가이러한 plist 를읽어오는것을알수있다. < 정적분석 : plist 파일을읽는함수 > - 7 -
gdb 를통해위모듈에서사용된 dictionarywithcotentsoffile 에브레이크포인트를 두었다. 디버깅결과, 해당함수의인자값으로 plist 파일이사용되는것을볼수있다. < 동적분석 : 함수가읽는 plist 파일이름이저장된레지스터확인 > 해당앱은 filetocheck.plist 를읽어탈옥관련프로그램및 ios 악성코드가설치되어있는지를 fileexistsatpath:isdirectory 함수를통해확인한다. 아래결과는 fileexistsatpath:isdirectory 함수의인자값인파일이름이다. 해당함수실행결과, 리턴값을모두 0으로설정하면탈옥체크모듈우회가가능하다. < 동적분석 : 탈옥관련파일및 ios 악성코드확인모듈디버깅 > 위와같은방법으로아이패드등에서악성앱발생시정적분석 (IDA 등 ) 과동적분석 (gdb 등 ) 이가능할것으로보인다. - 8 -
3. 아이패드탈옥 본보고서에서는 ios 5.1.1이설치된 ipad 1을대상으로탈옥 (JailBreak) 하여분석환경을구성하였다. 탈옥을하기위해사용한프로그램은 absinthe-win-2 이며아이패드를연결한후 JailBreak 버튼을누르면탈옥이진행된다. < 탈옥 (Jailbreak) 을위한 absinthe 프로그램 > < 탈옥전 > < 탈옥진행화면 > 탈옥 (JailBreak) 이성공하게되면아이패드바탕화면에 Absinthe 와 Cydia 아이콘이생성된다. Cydia는탈옥된 Mac OS에서다양한앱을다운로드받을수있는앱마켓이다. 소스추가를통해앱다운로드경로를확장할수있다. < 탈옥 (JailBreak) 시생성되는어플 > - 9 -
탈옥된폰에서기본적으로필요한툴은 ifile, Mobile Terminal, Open SSH, APT 등이있다. 해당툴은 Cydia 에서검색하여다운로드및설치할수있다. < 어플종류및기능 > 어플 ifile Mobile Terminal Open SSH APT 0.7 HTTPS Method 내용 ifile은윈도우탐색기와같이보기쉬운인터페이스를통해파일을열람하고폴더생성, 파일복사및삭제등을지원하는어플임아이패드에커맨드형식으로접근할수있도록지원하는쉘 (Shell) 어플임원격지에서아이패드에안전하게접근하도록지원하는쉘 (Secure Shell) 어플임 wget, whois, libxml2 등 ios에서실행가능한기본명령어및라이브러리를설치해주는어플임 이외에도여러가지라이브러리혹은툴을설치하려면 root 계정이필요한경우가 있다. 공장출하상태에서 ios 5.1.1 의비밀번호는 alphine 로기본설정되어있다. < root 계정으로로그인 ( 패스워드 : alphine) > - 10 -
4. 공유기등을이용한원격파일송수신및디버깅환경구성 아이패드에서동작하는앱을동적분석하기위해에그, 공유기에 PC와아이패드를연결시켜 SSL과 SFTP로파일송수신및원격디버깅이가능하도록환경을구성하였다. < 에그를이용한원격파일송수신및디버깅환경구성 > PC 에는 SSL 접속을위해 putty 를설치하였으며아이패드에서확인한아이피로 로그인하면명령실행창을얻을수있다. < 아이패드아이피확인 > < Putty 를통한로그인 > - 11 -
아래와같이보안경고창이뜨나예 (Y) 를클릭하여 root 계정으로접속한다. < Putty 접속시보안경고창 > 아이패드에서작업을하다보면 PC와아이패드간파일송수신이빈번히일어난다. 편의를위해 SFTP를통해 PC에서아이패드로접속하도록설정하였다. 본보고서에는 PC에 FileZilla Client 버전을설치한뒤 sftp://192.168.1.100( 아이패드아이피 ), 아이패드아이디및패스워드를입력하여아이패드에접속하였다. < FTP Client 를통한아이패드접속 > - 12 -
5. ios 용 GNU Debugger(iOS 5&6) 설치 ios 5 를지원하는 GNU Debugger 를설치하기위해 Cydia 에서소스를추가한다. 소스에 cydia.radare.org 추가한뒤 GNU Debugger 를검색하여설치한다. < Cydia 에서소스추가 > < 소스업데이트화면 > < GNU Debugger (ios 5&6) > gdb 명령입력시다음과같이 Apple 버전임을명시하고있으면설치가완료된것이다. 만약특정프로세스를분석하고싶다면 gdb p [PID] 명령을입력하면된다. 혹은아래그림과같이 gdb가실행중일때 attach [ 프로세스이름 ] 을입력하면분석이가능하다. < Apple gdb 실행화면 > < 분석을위한프로세스디버깅방법 > - 13 -
6. 동적디버깅및소스수정을위한 Cycript 설치 cycript 설치방법은아래와같다. 1 cycript 공식사이트인 http://www.cycript.org/debs 에접속하여 deb 파일다운로드 < cycript 파일다운로드 > 2 다운로드받은 deb 파일설치하면완료 * dpkg i cycript_0.9.501_iphones-arm.deb < 다운로드받은 cycript 설치 > - 14 -
7. 아이패드앱구성 일반적으로탈옥된환경에서앱은 /var/mobile/applications/[ 알파벳, 숫자조합 ] 에모든정보가그대로저장되어있다. < 앱이저장된디렉토리 > ios 앱개발툴인 Xcode를통해앱은보통 ipa 파일로생성되는데해당파일의압축을풀면내부에 Payload 폴더와 itunesartwork, itunesmetadata.plist로구성되어있다. itunesartwork와 itunesmetadata.plist 파일은 itunes에서해당앱을관리하기위해사용하는파일로서실제 itunesmetadata.plist을열어보면사용자 id, 구매날짜, 앱버전등의정보가 xml 형태로포함되어있다. < itunesmetadata.plist 파일 > Payload 폴더에는소스코드가컴파일된바이너리클래스파일 (App Binary), 그림등의리소스파일 (Bundle resources), 앱권한설정값 (mobile provision), 코드서명값 (CodeSignature) 이존재한다. 이중우리가정적분석을위해사용할파일은클래스바이너리파일 (App binary) 이다. class-dump-z는클래스파일을 - 15 -
주요 Objective-C Class Interface 형태로변환해주는툴이다. < 아이폰앱구성도 [2] > 8. 바이너리 ( 클래스 ) 파일리버싱 기본제공툴인 class-dump 를통해 TinyTower 의덤프를생성하였으나깨진 형태로보였다. 그러나 class-dump-z 으로덤프생성하자암호화되었다고표시는 되지만깨진형태로출력되지않는것으로확인되었다. < class-dump 사용시 > < class-dump-z 사용시 > - 16 -
class-dump-z 설치과정은다음과같다. 1 설치파일다운로드 * wget http://networkpx.googlecode.com/files/class-dump-z_0.2a.tar.gz < class-dump-z 파일다운로드 > 2 tar 압축풀기 * tar xvzf class-dump-z_0.2a.tar.gz < tar 압축풀기 > 3 class-dump-z 실행파일을 /user/bin 디렉토리로옮기기 * cp iphone_armv6/class-dump-z /usr/bin < /usr/bin 디렉토리에 class-dump-z 설치 > 4 class-dump-z 입력시다음과같이사용방법이나오면설치완료 < class-dump-z 실행 > - 17 -
9. 암호화된앱크랙방법 암호화된형태의덤프파일을올바른형태로보기위해서는 clutch 툴을이용 하여앱을먼저크랙해야한다. clutch 툴을설치하는방법은여러가지가있으나 가장쉬운방법은 Cydia 에서소스를추가한뒤설치하는것이다. clutch 툴설치방법 1 Cydia 앱에서소스 (http://ihacksrepo.com) 추가 < clutch 다운로드를위해소스추가 > 2 clutch 검색및설치 < clutch 검색및설치 > - 18 -
3 clutch 입력시크랙가능한앱목록출력 4 clutch [ 앱이름 ] 실행시 /var/root/documents/cracked 폴더에 ipa 압축 파일형태로복호화된앱이생성됨 < clutch 를통한앱크랙 > 5 ipa 압축파일해제 * 앱이름폴더생성 : mkdir [ 앱이름 ] * [ 앱이름 ] 폴더에압축해제 : unzip [ 앱이름 ].ipa d [ 생성한폴더이름 ] 크랙이완료된이후내부주요 Interface, 함수, 변수, 구조체등의목록을알아내기 위해이전에설치한 class-dump-z 를이용한다. 1 클래스파일을 class-dump-z 를통해덤프 * class-dump-z [ 앱이름의클래스바이너리 ] > [ 원하는파일이름 ].txt 2 덤프내용확인 * head 20 [ 원하는파일이름 ].txt < 덤프내용확인 > - 19 -
그러나이러한덤프내용은앱기능별로출력하지않고모든함수, 구조체, 변수등을한파일에서보여주기때문에분석이어렵다. Theos라는개발커맨드방식툴은헤더파일로구분해주어기능별로분석이훨씬수월하다. 하지만 Theos 없이도 IDA 툴을사용하여크랙된 class파일을분석하면내부변수, 함수등뿐만아니라 Objective-C 소스코드도볼수있다. < 헤더별로내부변수, 함수등을출력해주는 Theos> < IDA 를통해확인된내부변수, 함수등 > Theos 설치방법은다음과같다. 1 (installtheos3 를통해설치될경우 ) 약 20 분소요 < installtheos3 설치 > - 20 -
2-1 (installtheos3를통해설치되지않을경우 ) perl 다운로드및설치 * wget http://coredev.nl/cydia/coredev.pub * apt-key add coredev.pub * echo deb http://coredev.nl/cydia iphone main > /etc/apt/sources.list.d/coredev.nl.list < Perl 다운로드및설치 > 2-2 perl 버전확인 < Perl 버전확인 > 2-3 다음과같이 howett.net.list 파일생성 * echo deb http://nix.howett.net/theos./ > /etc/apt/sources.list.d/howett.net.list < howett.net.list 파일생성 > - 21 -
2-4 apt-get update 실행 < apt-get update 실행 > 2-5 apt-get install perl net.howett.theos < perl 을통해 net.howett.theos 설치 > 3 환경변수설정후다음과같이실행했을때메뉴가나오면 theso 설치완료 * export THEOS=/var/theos * $THEOS/bin/nic.pl < 환경변수설정및 theos 실행 > - 22 -
10. 크랙된앱설치 크랙된앱을설치하는방법은아래와같다. 1 Cydia 를통해 AppSync 검색및설치 < AppSync 검색및설치 > 2 http://i-funbox.com/ 를통해 ifunbox 다운로드및설치 < ifunbox 다운로드및설치 > - 23 -
3 PC 와아이패드를연결한후 App 설치 아이콘을클릭하고설치할앱을선택 < ifunbox 를통한 App 설치 > 4 다음과같이 App 설치결과화면이보이면완료 < App 설치결과 > - 24 -
참고자료 [1] http://www.f-secure.com/weblog/archives/00002699.html [2] http://floatlearning.com/2011/11/re-signing-an-ios-app-without-xcode/ [3] http://orchilles.com/preparing-ios7-to-test-ios-apps/ - 25 -