Objective-C Runtime의 이해와 gdb attach 하기

 

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 * 을 하면 앱들을 확인할수 있다.

ios_obj-c1

이 중에 Twitter 앱을 otool을 사용해서 import 를 살펴보면 아래와 같이 나온다.

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 했다.
ios_obj-c2

그런데 보면 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/

ios_obj-c3

이제야 뭔가가 되는 느낌이다..

이제 어디에 brack point를 걸어야 할까?

Objective-C 는 메세지 기반의 언어이다.

모든 처리를 메세지를 보내고 받으면서 동작한다.

메세지를 보낼때 사용하는 메소드가 objc_msgSend() 이다.

이 메소드에 break point를 걸어두면 앱을 분석하는데 많은 도움이 된다.

그리고 $r0과 $r1 레지스터의 정보도 확인하면 좋다.

$r0 는 어떤 클래스의 어떤 메소드가 메세지를 보내는지 확인할수 있고,
$r1 은 selector 를 찾을 수있다.

자 그럼 objc_msgSend 에 bp를 걸고 $r0 와 $r1 레지스터를 확인해보자
ios_obj-c4

오 근데 $r0 은 주소만 나오고 클래스와 메소드가 안보인다.(어떤설정을 해줘야 하는지 모르겠다..ㅠ)

그래도 이런 방식으로 동적디버깅을 진행하면 될듯.,.

참고 : http://highaltitudehacks.com/2013/06/16/ios-application-security-part-3-understanding-the-objective-c-runtime/
 

This entry was posted in Objective-C/iPhone, Security/Hacking and tagged , . Bookmark the permalink.

3 Responses to Objective-C Runtime의 이해와 gdb attach 하기

댓글 남기기