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

12분 읽기 작성 2014.04.16

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/
 

“Objective-C Runtime의 이해와 gdb attach 하기”에 대한 3개의 생각

  1. 안녕하세요 다름이 아니라 저 사이트에 가서 arm-gdb-apple-darwin 이라는걸 받고 아이폰에서
    다운로드 된 폴더에 가서 /usr/bin 으로 옮겼습니다 그리고 ln -s arm-gdb-apple-darwin gdb 로 링크파일을 만들었는데
    저렇게 실행이 되지가 않네요 아이폰에서 cydia를 실행한후 ps aux 해도 나오질 않고
    제가 간단하게 C로 짠 파일을 gdb로 열면 암셈블리어는 보이지만 브레이크 포인터가 걸리지도 않구요

    저사이트에 보면 Makefile 과 arm-gdb-apple-darwin 이라느 파일 두개가 있는데
    두개 다받고 둘다 /usr/bin 에 옮겼습니다 제가 잘못설정 해서 그런건가요?

  2. 테스트 환경이 어떻게 되시나요?
    위의 환경은 iOS 6버전이였던 것 같은데..
    아마도 버전문제가 아닐까 싶네요..

  3. 테스트 환경은 ios 7.1.2 탈옥입니다 제가 남긴 덧글처럼 진행한다면 아무문제 없는건가요?
    에러는 다음과 같이 뜨네요
    Unable to access task for process-id 3289: (os/kern) failure.

    시디아에서 받은 GDB로 하면 블로그에 나왔던거 처럼 그냥

    >> 0x12345667()

    이런식으로만 뜨네요 레지스트리 정보는 뜨지만
    메인 함수 호출하면 아무것도 안뜹니다… 도와주시면 커피라도 한잔 사겠습니다
    도와주세요… 몇날 몇일을 하는지..

댓글 남기기