24
Jailbreak: разработка без лимитов Владимир Пузанов [email protected] Владимир Кириллов [email protected] Hack&Dev Team

Владимир Пузанов - JailBreak: Разработка без лимитов

Embed Size (px)

Citation preview

Page 1: Владимир Пузанов - JailBreak: Разработка без лимитов

Jailbreak: разработка без лимитов

Владимир Пузанов [email protected]Владимир Кириллов [email protected]

Hack&Dev Team

Page 2: Владимир Пузанов - JailBreak: Разработка без лимитов

Что такое Jailbreak

возможность доступа ко всей ФС устройствавозможность выполнения приложений вне системной песочницы

использование всех системных вызовов, в т.ч. fork(2)

возможность запуска неподписанных бинарников

возможность использования динамических библиотек

активируется при помощи бинарного патча на ядро

SandboxСистемный фреймворк для ограничения доступа, управляется набором правил(аналог systrace, DTrace)Активен для всех установленых приложений (в ˜/Applications/).

Page 3: Владимир Пузанов - JailBreak: Разработка без лимитов

Cydia

Порт APT (Application PackagingTool для Debian Linux) на iPhone,GUI.

Полноценная системазависимостей, обновлений иблокировок.

Встроенный магазин для продажиконтента (Cydia Store).

Page 4: Владимир Пузанов - JailBreak: Разработка без лимитов

Новые горизонты

публикация (и продажа) приложений, не прошедших модерацию в AppStoreинтеграция привычных UNIX-приложений на iPhone:

OpenSSHgdb<your favorite unix tool here>

темы оформлениярасширеная функциональность:

доступ ко всем системным вызовамиспользование демоновинъекция в приложения (в том числе системные демоны и менеджеры:SpringBoard, etc.)

Page 5: Владимир Пузанов - JailBreak: Разработка без лимитов

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

Page 6: Владимир Пузанов - JailBreak: Разработка без лимитов

Mach Object

reference: xnu/osfmk/mach-o/

заголовокstruct mach_header

команды загрузки (описывают разметку и компоновочные характеристикифайла)struct load_command

сегменты — описывают регионы виртуальной памяти (код, данные, стек, ...)struct segment_command

сегмент редактирования ссылок (link edit, для динамических бинарников)struct dysymtab_command

Page 7: Владимир Пузанов - JailBreak: Разработка без лимитов

Лезем в бинарник

binutils

as ассемблер

ld компоновщик объектных файлов

dyld рантаймовый редактор компоновки

nm просмотрщик символов (помогает найти точки для внедрения)

otool парсер формата Mach-O (информация о бинарнике)

Page 8: Владимир Пузанов - JailBreak: Разработка без лимитов

Разметка бинарного файла

mobile$ otool -hlL /bin/bash # stripped/bin/bash:Mach header

magic cputype cpusubtype caps filetype ncmds sizeofcmds flags0xfeedface 12 0 0x00 2 15 1560 0x00000085

Load command 1cmd LC_SEGMENT

cmdsize 396segname __TEXTvmaddr 0x00001000vmsize 0x00070000

fileoff 0filesize 458752maxprot 0x00000005

initprot 0x00000005nsects 5flags 0x0

Sectionsectname __textsegname __TEXT

addr 0x00002000size 0x0005942c

offset 4096align 2^2 (4)

reloff 0nreloc 0flags 0x80000400

reserved1 0reserved2 0

Load command 6cmd LC_LOAD_DYLINKER

cmdsize 28name /usr/lib/dyld (offset 12)

Page 9: Владимир Пузанов - JailBreak: Разработка без лимитов

Виртуальная память процесса — 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/launchdSTACK GUARD 000000010005b000-000000010005c000 4K ---/rwx SM=NULSTACK 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/launchdMALLOC (admin) 000000010003e000-000000010003f000 4K rw-/rwx SM=PRVStack 000000010005c000-00000001000de000 520K rw-/rwx SM=COW thread 1Mach message 00000001000fb000-00000001000fd000 8K rw-/rwx SM=PRVMALLOC_LARGE 00000001000fd000-00000001000fe000 4K rw-/rwx SM=COW DefaultMallocZone_0x10003e000Stack 0000000100401000-0000000100483000 520K rw-/rwx SM=PRV thread 2shared memory 0000000100483000-000000010048c000 36K rw-/rwx SM=SHMshared memory 000000010048d000-0000000100490000 12K rw-/rwx SM=SHMMALLOC_LARGE (freed) 0000000101800000-0000000102200000 10.0M rw-/rwx SM=COWStack 00007fff5f400000-00007fff5fc00000 8192K rw-/rwx SM=SHM thread 0__DATA 00007fff5fc3c000-00007fff5fc7b000 252K rw-/rwx SM=COW /usr/lib/dyld

==== Summary for process 1ReadOnly 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%)

Page 10: Владимир Пузанов - JailBreak: Разработка без лимитов

More Tools

gdb GNU Debugger, позволяет изучать программу изнутри почти врежиме интерпретаторареализован на ptrace(2)

class-dump генератор прототипов классов и протоколов на базе runtime-секциибинарника

IDA профессиональный инструмент для дизассемблирования и анализакода

ARM Help встроенный в OSX ARMARM с индексированием

man(1) ваш друг, товарищ и брат

Page 11: Владимир Пузанов - JailBreak: Разработка без лимитов

Как не потерятся в hex’e — IDA

Page 12: Владимир Пузанов - JailBreak: Разработка без лимитов

Лезем в бинарник — время выполнения

DYLD_PRELOAD (dyld(1))изменение протекции виртуальных страниц — vm_protect/mprotect(2)

не везде!

Page 13: Владимир Пузанов - JailBreak: Разработка без лимитов

Плагин для просмотра баланса оператора

Разработаем плагин, который

1 будет посылать USSD-запрос оператору с текстом ∗101#

2 будет перехватывать интерфейс USSD-оповещений в SpringBoard и временноотключать его

3 будет обрабатывать ответ и выдирать из него остаток на счету

4 будет показывать остаток в форме, доступной через SBSettings

5 и будет автоматически обновлять баланс каждые пять минут

Page 14: Владимир Пузанов - JailBreak: Разработка без лимитов

Алло, коммборд!

Для звонков в iPhone используется связка из MobilePhone, CoreTelephony иcommcenter.Необходимый нам код скорее всего находится в MobilePhone, изучим его с помощьюclass-dump, IDA и GDB...Судя по списку классов, нам надо смотреть в PhoneApplication, особенно красивметод

- (BOOL)dialPhoneNumber:(NSString *)phoneforUID:(int)fp12dialAssist:(BOOL)fp16;// IMP=0x0000a14c

Page 15: Владимир Пузанов - JailBreak: Разработка без лимитов

Внутри MobilePhone...

Агрументы функции в arm передаются в регистрах (при этом не забываем про“магические” self и cmd в r0 и r1). Остановим выполнение MobilePhone в gdb прямов начале потенциального метода:

(gdb) b *0xa14cBreakpoint 1 at 0xa14c(gdb) contContinuing.

и посмотрим на phone, как только брекпоинт сработает:Breakpoint 1, 0x0000a14c in ?? ()(gdb) po $r2*101#

(тут po — сокращение от print-object, команды, которая вызывает -description нацелевом ObjC-объекте)

Page 16: Владимир Пузанов - JailBreak: Разработка без лимитов

Внутри MobilePhone... (продолжение)

В теле функции есть интересный вызов к CoreTelephony: CTCallDialWithID

После анализа тела функции выше, можно смело утверждать о назначании двухаргументов этой функции. Попробуем запустить ее самостоятельно:

(gdb) p (int)*0x5e3ac(@"*101#", -1)0x0

функция выполнилась, а на экране – UI отправки USSD запроса. Искомый API дляинициализации USSD запросов найден.

Page 17: Владимир Пузанов - JailBreak: Разработка без лимитов

MobileSubstrate — перехват вызовов

MobileSubstrate позволяет перехватить C и ObjC вызовы и выполнить необходимыйкод. Так, Winterboard перехватывает open и возвращает не оригинальные файлы сграфикой, а файлы из каталогов текущей темы.

Функции:

инъекция в любую ARM/Thumb C-функцию

инъекция в любой Objective-C метод

загрузка пользовательских библиотек или бандлов

Page 18: Владимир Пузанов - JailBreak: Разработка без лимитов

Блокируем USSD интерфейс в SpringBoard

Задача: заблокировать отображение USSD-окон в SpringBoard.получим список классов с помощью class-dump и изучим их. Нашей целискорее всего соответствует класс SBUSSDAlert.с помощью анализа бектрейса у методов этого класса (используя брейкпоинтыв gdb и адресам полученным из class-dump), что в методе+registerForAlerts происходит регистрация SpringBoard в системе событийCoreTelephony.

Page 19: Владимир Пузанов - JailBreak: Разработка без лимитов

SpringBoard inside

Page 20: Владимир Пузанов - JailBreak: Разработка без лимитов

Компилируем код без Xcode

используйте make(1) (GNU Make для OSX)DEV=/Developer/Platforms/iPhoneOS.platform/DeveloperCC=$(DEV)/usr/bin/arm-apple-darwin9-gcc-4.2.1SDK=$(DEV)/SDKs/iPhoneOS3.0.sdkLD=$(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

Page 21: Владимир Пузанов - JailBreak: Разработка без лимитов

Makefile на каждый день

make(1) (OpenBSD), bsdmake(1) (OS X), pmake(1) (Linux)SRC?= jailINCL?= template.tex pygments.texVIEWER?= evince -sPREVIEWER?= 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

Page 22: Владимир Пузанов - JailBreak: Разработка без лимитов

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; \

donenframes:

grep ’\\begin{frame}’ ${.CURDIR}/${SRC}.tex | grep -v ’\s*%’ | wc -l

.PHONY: clean view src nframes

.SUFFIXES: .eps .pdf

.eps.pdf:epstopdf $<

Page 23: Владимир Пузанов - JailBreak: Разработка без лимитов

Плагин для SpringBoard

Можно встроится в какой-то из UIView от SpringBoard (например в lock–screen), илипросто сделать плагин для SBSettings:

Page 24: Владимир Пузанов - JailBreak: Разработка без лимитов

Итак, для того, чтобы рассказать Вам про Jailbreak мы:

farcaller@ покурил ARMARM и дампы xxd

proger@ наконец залез в исходники XNU

одели костюмы (:P)

© 2009 Hack&Dev Team