Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jailbreak: Unlimited Development

Jailbreak: Unlimited Development

Vladimir Pouzanov

July 09, 2009
Tweet

More Decks by Vladimir Pouzanov

Other Decks in Programming

Transcript

  1. Что такое Jailbreak возможность доступа ко всей ФС устройства возможность

    выполнения приложений вне системной песочницы использование всех системных вызовов, в т.ч. fork(2) возможность запуска неподписанных бинарников возможность использования динамических библиотек активируется при помощи бинарного патча на ядро Sandbox Системный фреймворк для ограничения доступа, управляется набором правил (аналог systrace, DTrace) Активен для всех установленых приложений (в ˜/Applications/).
  2. Cydia Порт APT (Application Packaging Tool для Debian Linux) на

    iPhone, GUI. Полноценная система зависимостей, обновлений и блокировок. Встроенный магазин для продажи контента (Cydia Store).
  3. Новые горизонты публикация (и продажа) приложений, не прошедших модерацию в

    AppStore интеграция привычных UNIX-приложений на iPhone: OpenSSH gdb <your favorite unix tool here> темы оформления расширеная функциональность: доступ ко всем системным вызовам использование демонов инъекция в приложения (в том числе системные демоны и менеджеры: SpringBoard, etc.)
  4. Hacking iPhone: ABI ABI Application Binary Interface набор соглашений между

    программами, библиотеками и операционной системой, обеспечивающих взаимодействие этих компонентов на низком уровне на данной платформе Mach-O Mach Object стандарт ABI в Mac OS X (mach-o(5)) mobile$ file /System/Library/CoreServices/SpringBoard.app/SpringBoard /System/Library/CoreServices/SpringBoard.app/SpringBoard: Mach-O executable acorn
  5. Mach Object reference: xnu/osfmk/mach-o/ заголовок struct mach_header команды загрузки (описывают

    разметку и компоновочные характеристики файла) struct load_command сегменты описывают регионы виртуальной памяти (код, данные, стек, ...) struct segment_command сегмент редактирования ссылок (link edit, для динамических бинарников) struct dysymtab_command
  6. Лезем в бинарник binutils as ассемблер ld компоновщик объектных файлов

    dyld рантаймовый редактор компоновки nm просмотрщик символов (помогает найти точки для внедрения) otool парсер формата Mach-O (информация о бинарнике)
  7. Разметка бинарного файла mobile$ otool -hlL /bin/bash # stripped /bin/bash:

    Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags 0xfeedface 12 0 0x00 2 15 1560 0x00000085 Load command 1 cmd LC_SEGMENT cmdsize 396 segname __TEXT vmaddr 0x00001000 vmsize 0x00070000 fileoff 0 filesize 458752 maxprot 0x00000005 initprot 0x00000005 nsects 5 flags 0x0 Section sectname __text segname __TEXT addr 0x00002000 size 0x0005942c offset 4096 align 2^2 (4) reloff 0 nreloc 0 flags 0x80000400 reserved1 0 reserved2 0 Load command 6 cmd LC_LOAD_DYLINKER cmdsize 28 name /usr/lib/dyld (offset 12)
  8. Виртуальная память процесса vmmap(1) Virtual Memory Map of process 1

    (launchd) ==== Non-writable regions for process 1 __TEXT 0000000100000000-000000010002a000 168K r-x/rwx SM=COW /sbin/launchd __LINKEDIT 000000010002d000-0000000100036000 36K r--/rwx SM=COW /sbin/launchd STACK GUARD 000000010005b000-000000010005c000 4K ---/rwx SM=NUL STACK GUARD 00007fff5bc00000-00007fff5f400000 56.0M ---/rwx SM=NUL __TEXT 00007fff5fc00000-00007fff5fc3c000 240K r-x/rwx SM=COW /usr/lib/dyld __LINKEDIT 00007fff5fc7b000-00007fff5fc8f000 80K r--/rwx SM=COW /usr/lib/dyld ==== Writable regions for process 1 __DATA 000000010002a000-000000010002c000 8K rw-/rwx SM=COW /sbin/launchd __DATA 000000010002c000-000000010002d000 4K rw-/rwx SM=PRV /sbin/launchd MALLOC (admin) 000000010003e000-000000010003f000 4K rw-/rwx SM=PRV Stack 000000010005c000-00000001000de000 520K rw-/rwx SM=COW thread 1 Mach message 00000001000fb000-00000001000fd000 8K rw-/rwx SM=PRV MALLOC_LARGE 00000001000fd000-00000001000fe000 4K rw-/rwx SM=COW DefaultMallocZon Stack 0000000100401000-0000000100483000 520K rw-/rwx SM=PRV thread 2 shared memory 0000000100483000-000000010048c000 36K rw-/rwx SM=SHM shared memory 000000010048d000-0000000100490000 12K rw-/rwx SM=SHM MALLOC_LARGE (freed) 0000000101800000-0000000102200000 10.0M rw-/rwx SM=COW Stack 00007fff5f400000-00007fff5fc00000 8192K rw-/rwx SM=SHM thread 0 __DATA 00007fff5fc3c000-00007fff5fc7b000 252K rw-/rwx SM=COW /usr/lib/dyld ==== Summary for process 1 ReadOnly portion of Libraries: Total=33.0M resident=4804K(14%) swapped_out_or_unallocated=28.3M(86%) Writable regions: Total=38.3M written=384K(1%) resident=476K(1%) swapped_out=320K(1%) unallocated=37.8M(99%)
  9. More Tools gdb GNU Debugger, позволяет изучать программу изнутри почти

    в режиме интерпретатора реализован на ptrace(2) class-dump генератор прототипов классов и протоколов на базе runtime-секции бинарника IDA профессиональный инструмент для дизассемблирования и анализа кода ARM Help встроенный в OSX ARMARM с индексированием man(1) ваш друг, товарищ и брат
  10. Плагин для просмотра баланса оператора Разработаем плагин, который 1 будет

    посылать USSD-запрос оператору с текстом ∗101# 2 будет перехватывать интерфейс USSD-оповещений в SpringBoard и временно отключать его 3 будет обрабатывать ответ и выдирать из него остаток на счету 4 будет показывать остаток в форме, доступной через SBSettings 5 и будет автоматически обновлять баланс каждые пять минут
  11. Алло, коммборд! Для звонков в iPhone используется связка из MobilePhone,

    CoreTelephony и commcenter. Необходимый нам код скорее всего находится в MobilePhone, изучим его с помощью class-dump, IDA и GDB... Судя по списку классов, нам надо смотреть в PhoneApplication, особенно красив метод - (BOOL)dialPhoneNumber:(NSString *)phone forUID:(int)fp12 dialAssist:(BOOL)fp16; // IMP=0x0000a14c
  12. Внутри MobilePhone... Агрументы функции в arm передаются в регистрах (при

    этом не забываем про “магические” self и cmd в r0 и r1). Остановим выполнение MobilePhone в gdb прямо в начале потенциального метода: (gdb) b *0xa14c Breakpoint 1 at 0xa14c (gdb) cont Continuing. и посмотрим на phone, как только брекпоинт сработает: Breakpoint 1, 0x0000a14c in ?? () (gdb) po $r2 *101# (тут po сокращение от print-object, команды, которая вызывает -description на целевом ObjC-объекте)
  13. Внутри MobilePhone... (продолжение) В теле функции есть интересный вызов к

    CoreTelephony: CTCallDialWithID После анализа тела функции выше, можно смело утверждать о назначании двух аргументов этой функции. Попробуем запустить ее самостоятельно: (gdb) p (int)*0x5e3ac(@"*101#", -1) 0x0 функция выполнилась, а на экране – UI отправки USSD запроса. Искомый API для инициализации USSD запросов найден.
  14. MobileSubstrate перехват вызовов MobileSubstrate позволяет перехватить C и ObjC вызовы

    и выполнить необходимый код. Так, Winterboard перехватывает open и возвращает не оригинальные файлы с графикой, а файлы из каталогов текущей темы. Функции: инъекция в любую ARM/Thumb C-функцию инъекция в любой Objective-C метод загрузка пользовательских библиотек или бандлов
  15. Блокируем USSD интерфейс в SpringBoard Задача: заблокировать отображение USSD-окон в

    SpringBoard. получим список классов с помощью class-dump и изучим их. Нашей цели скорее всего соответствует класс SBUSSDAlert. с помощью анализа бектрейса у методов этого класса (используя брейкпоинты в gdb и адресам полученным из class-dump), что в методе +registerForAlerts происходит регистрация SpringBoard в системе событий CoreTelephony.
  16. Компилируем код без Xcode используйте make(1) (GNU Make для OSX)

    DEV=/Developer/Platforms/iPhoneOS.platform/Developer CC=$(DEV)/usr/bin/arm-apple-darwin9-gcc-4.2.1 SDK=$(DEV)/SDKs/iPhoneOS3.0.sdk LD=$(CC) LDFLAGS=-lobjc -dynamiclib -bind_at_load \ -L"$(SDK)$/usr/lib/" \ -F"$(SDK)$/System/Library/PrivateFrameworks/" \ -F"$(SDK)/System/Library/Frameworks/" \ -framework CoreTelephony \ -framework CoreFoundation -framework Foundation -framework UIKit \ -framework CoreGraphics -framework SystemConfiguration CFLAGS=-fconstant-cfstrings -std=gnu99 -Wall -O2 \ -I"$(SDK)/usr/include" \ -I"$(DEV)/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/" \ -F"$(SDK)/System/Library/Frameworks" \ -F"$(SDK)/System/Library/PrivateFrameworks" \ -I"$(SDK)" VERSION=1.0 Balance.dylib: main.o BalanceView.o SBSwizzler.o Oper_Djuice.o Oper_MTC.o $(LD) $(LDFLAGS) -o $@ $^ env CODESIGN_ALLOCATE=$(DEV)/usr/bin/codesign_allocate ldid -S Balance.dylib
  17. Makefile на каждый день make(1) (OpenBSD), bsdmake(1) (OS X), pmake(1)

    (Linux) SRC?= jail INCL?= template.tex pygments.tex VIEWER?= evince -s PREVIEWER?= evince .PATH: ${.CURDIR} FIG= FIGPDF= ${FIG:S/.eps/.pdf/g} ${SRC}.pdf: ${SRC}.tex ${INCL} ${FIG} env TEXINPUTS=:${.CURDIR} pdflatex ${SRC}.tex ${FIGPDF}: ${FIG} figs: ${FIGPDF} obj: -[ -d ${.CURDIR}/obj ] || mkdir -p ${.CURDIR}/obj clean: -rm -f *.{aux,log,nav,out,snm,toc,pdf} view: ${SRC}.pdf ${VIEWER} ${SRC}.pdf pre: ${SRC}.pdf ${PREVIEWER} ${SRC}.pdf
  18. Makefile на каждый день (продолжение) src: for source in ‘find

    ${.CURDIR}/src/ -type f | grep -v CVS‘; \ do \ printf ">>> %s\n\n" $$source; \ pygmentize -f latex $$source \ | perl -pi -e ’s/Verbatim\}\[/Verbatim\}\[fontsize=\\footnotesize,/g’; \ echo; \ done nframes: grep ’\\begin{frame}’ ${.CURDIR}/${SRC}.tex | grep -v ’\s*%’ | wc -l .PHONY: clean view src nframes .SUFFIXES: .eps .pdf .eps.pdf: epstopdf $<
  19. Плагин для SpringBoard Можно встроится в какой-то из UIView от

    SpringBoard (например в lock–screen), или просто сделать плагин для SBSettings:
  20. Итак, для того, чтобы рассказать Вам про Jailbreak мы: farcaller@

    покурил ARMARM и дампы xxd proger@ наконец залез в исходники XNU одели костюмы (:P) © 2009 Hack&Dev Team