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 를 살펴보면 아래와 같이 나온다.

그러면, 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 하기

  1. 김주원 says:

    안녕하세요 다름이 아니라 저 사이트에 가서 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. apollo89 says:

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

  3. 김주원 says:

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

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

    >> 0x12345667()

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

댓글 남기기