Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
iOS 앱 보안진단을 위한 환경설정
iOS 앱 정적 분석하기(class-dump-z, clutch)
Objective-C Runtime의 이해와 gdb attach 하기
iOS 앱 Cycript를 이용항 동적분석 및 변조
개발자 등록하지 않고 iOS 기기에 앱 설치 하기
Cycript 를 이용해 iOS 앱 로그인 우회 실습
Snoop-it 을 이용해서 iOS 앱 분석하기
Objective-C 는 런타임 기반의 언어이다.
런타임 언어란 무엇인가?
런타임 언어란 기능과 링크 등의 구현을 응용 프로그램을 실행하는 중에 결정을 하는 언어다.
그러면, Objective-C는 런타임 언어인가?
아니다. 런타임 기반의 언어이다.
응용 프로그램 코드가 실제로 실행때까지 컴파일 및 링크 작업을 연기한다.
컴파일 타임 및 런타임 링크 등의 결정을 할 수있는 한 연기한다는 것이다. 즉, 가능하면 동적으로 하려고 한다는 의미다.
그러면, 프로그램에서 import하는 런타임 라이브러리를 살펴보자
먼저, /var/mobile/Applications/ 으로 이동한다.
ls * 을 하면 앱들을 확인할수 있다.
이 중에 Twitter 앱을 otool을 사용해서 import 를 살펴보면 아래와 같이 나온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Apollo89-iPad:/var/mobile/Applications/0A7F758E-A2BB-47D1-8D9A-0C8A5C75B7EF/Twitter.app root# otool -L Twitter Twitter: /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 158.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 51.1.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 221.0.0) /System/Library/Frameworks/Accelerate.framework/Accelerate (compatibility version 1.0.0, current version 4.0.0) /System/Library/Frameworks/CoreData.framework/CoreData (compatibility version 1.0.0, current version 479.1.0) /System/Library/Frameworks/ImageIO.framework/ImageIO (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/CoreImage.framework/CoreImage (compatibility version 1.0.0, current version 3.0.0) /System/Library/Frameworks/GLKit.framework/GLKit (compatibility version 1.0.0, current version 21.0.0) /System/Library/Frameworks/AdSupport.framework/AdSupport (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/OpenGLES.framework/OpenGLES (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/Accounts.framework/Accounts (compatibility version 1.0.0, current version 113.0.0) /System/Library/Frameworks/AddressBook.framework/AddressBook (compatibility version 1.0.0, current version 30.0.0) /System/Library/Frameworks/AddressBookUI.framework/AddressBookUI (compatibility version 1.0.0, current version 33.0.0) /System/Library/Frameworks/AssetsLibrary.framework/AssetsLibrary (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/AudioToolbox.framework/AudioToolbox (compatibility version 1.0.0, current version 492.0.0) /System/Library/Frameworks/AVFoundation.framework/AVFoundation (compatibility version 1.0.0, current version 2.0.0) /System/Library/Frameworks/CFNetwork.framework/CFNetwork (compatibility version 1.0.0, current version 672.0.2) /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 847.20.0) /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0) /System/Library/Frameworks/CoreLocation.framework/CoreLocation (compatibility version 1.0.0, current version 1613.0.0) /System/Library/Frameworks/CoreMedia.framework/CoreMedia (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/CoreText.framework/CoreText (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/CoreVideo.framework/CoreVideo (compatibility version 1.2.0, current version 1.8.0) /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1047.20.0) /System/Library/Frameworks/MapKit.framework/MapKit (compatibility version 1.0.0, current version 14.0.0) /System/Library/Frameworks/MediaPlayer.framework/MediaPlayer (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/MessageUI.framework/MessageUI (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 51.0.0) /System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.8.0) /System/Library/Frameworks/Security.framework/Security (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 613.0.0) /System/Library/Frameworks/Twitter.framework/Twitter (compatibility version 1.0.0, current version 164.0.0) /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 2903.2.0) /System/Library/Frameworks/StoreKit.framework/StoreKit (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/CoreTelephony.framework/CoreTelephony (compatibility version 1.0.0, current version 1633.6.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1198.0.0) /System/Library/Frameworks/SafariServices.framework/SafariServices (compatibility version 1.0.0, current version 1.0.0) Apollo89-iPad:/var/mobile/Applications/0A7F758E-A2BB-47D1-8D9A-0C8A5C75B7EF/Twitter.app root# |
그러면, Twitter에서 사용하는 런타임 라비으러리들을 볼수 있으며,
이 중 우리가 주목해서 봐야 할 라이브러리는 39번 줄의 /usr/lib/libobjc.A.dylib 이다.
이 라이브러리가 동적인 처리를 가능하게 해주는 라이브러리다.
다른 앱에서도 이 라이브러리를 볼 수 있다.
그럼 이제 gdb 를 이용해서 앱을 동적분석해보자.
twitter 앱을 실행한다.
그리고 ps aux |grep twitter 를 하면 twitter 앱의 pid를 확인할 수 있다.
pid으로 twitter 앱에 gdb attach 했다.
그런데 보면 bp도 잘안걸리고.. 정상적으로 gdb가 동작하지 않는 것을 확인할수 있다.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “–host=arm-apple-darwin9 –target=”.
그래서 인터넷에서 ios 용 gdb를 다운받아서 넣었다.
http://reverse.put.as/2012/04/16/how-to-compile-gdb-for-ios/
이제야 뭔가가 되는 느낌이다..
이제 어디에 brack point를 걸어야 할까?
Objective-C 는 메세지 기반의 언어이다.
모든 처리를 메세지를 보내고 받으면서 동작한다.
메세지를 보낼때 사용하는 메소드가 objc_msgSend() 이다.
이 메소드에 break point를 걸어두면 앱을 분석하는데 많은 도움이 된다.
그리고 $r0과 $r1 레지스터의 정보도 확인하면 좋다.
$r0 는 어떤 클래스의 어떤 메소드가 메세지를 보내는지 확인할수 있고,
$r1 은 selector 를 찾을 수있다.
자 그럼 objc_msgSend 에 bp를 걸고 $r0 와 $r1 레지스터를 확인해보자
오 근데 $r0 은 주소만 나오고 클래스와 메소드가 안보인다.(어떤설정을 해줘야 하는지 모르겠다..ㅠ)
그래도 이런 방식으로 동적디버깅을 진행하면 될듯.,.
3 Responses to Objective-C Runtime의 이해와 gdb attach 하기