Upload
pavel-bashmakov
View
2.282
Download
0
Embed Size (px)
Citation preview
Jailbreak: разработка без лимитов
Владимир Пузанов [email protected]Владимир Кириллов [email protected]
Hack&Dev Team
Что такое Jailbreak
возможность доступа ко всей ФС устройствавозможность выполнения приложений вне системной песочницы
использование всех системных вызовов, в т.ч. fork(2)
возможность запуска неподписанных бинарников
возможность использования динамических библиотек
активируется при помощи бинарного патча на ядро
SandboxСистемный фреймворк для ограничения доступа, управляется набором правил(аналог systrace, DTrace)Активен для всех установленых приложений (в ˜/Applications/).
Cydia
Порт APT (Application PackagingTool для Debian Linux) на iPhone,GUI.
Полноценная системазависимостей, обновлений иблокировок.
Встроенный магазин для продажиконтента (Cydia Store).
Новые горизонты
публикация (и продажа) приложений, не прошедших модерацию в AppStoreинтеграция привычных UNIX-приложений на iPhone:
OpenSSHgdb<your favorite unix tool here>
темы оформлениярасширеная функциональность:
доступ ко всем системным вызовамиспользование демоновинъекция в приложения (в том числе системные демоны и менеджеры:SpringBoard, etc.)
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
Mach Object
reference: xnu/osfmk/mach-o/
заголовокstruct mach_header
команды загрузки (описывают разметку и компоновочные характеристикифайла)struct load_command
сегменты — описывают регионы виртуальной памяти (код, данные, стек, ...)struct segment_command
сегмент редактирования ссылок (link edit, для динамических бинарников)struct dysymtab_command
Лезем в бинарник
binutils
as ассемблер
ld компоновщик объектных файлов
dyld рантаймовый редактор компоновки
nm просмотрщик символов (помогает найти точки для внедрения)
otool парсер формата Mach-O (информация о бинарнике)
Разметка бинарного файла
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)
Виртуальная память процесса — 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%)
More Tools
gdb GNU Debugger, позволяет изучать программу изнутри почти врежиме интерпретаторареализован на ptrace(2)
class-dump генератор прототипов классов и протоколов на базе runtime-секциибинарника
IDA профессиональный инструмент для дизассемблирования и анализакода
ARM Help встроенный в OSX ARMARM с индексированием
man(1) ваш друг, товарищ и брат
Как не потерятся в hex’e — IDA
Лезем в бинарник — время выполнения
DYLD_PRELOAD (dyld(1))изменение протекции виртуальных страниц — vm_protect/mprotect(2)
не везде!
Плагин для просмотра баланса оператора
Разработаем плагин, который
1 будет посылать USSD-запрос оператору с текстом ∗101#
2 будет перехватывать интерфейс USSD-оповещений в SpringBoard и временноотключать его
3 будет обрабатывать ответ и выдирать из него остаток на счету
4 будет показывать остаток в форме, доступной через SBSettings
5 и будет автоматически обновлять баланс каждые пять минут
Алло, коммборд!
Для звонков в iPhone используется связка из MobilePhone, CoreTelephony иcommcenter.Необходимый нам код скорее всего находится в MobilePhone, изучим его с помощьюclass-dump, IDA и GDB...Судя по списку классов, нам надо смотреть в PhoneApplication, особенно красивметод
- (BOOL)dialPhoneNumber:(NSString *)phoneforUID:(int)fp12dialAssist:(BOOL)fp16;// IMP=0x0000a14c
Внутри 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-объекте)
Внутри MobilePhone... (продолжение)
В теле функции есть интересный вызов к CoreTelephony: CTCallDialWithID
После анализа тела функции выше, можно смело утверждать о назначании двухаргументов этой функции. Попробуем запустить ее самостоятельно:
(gdb) p (int)*0x5e3ac(@"*101#", -1)0x0
функция выполнилась, а на экране – UI отправки USSD запроса. Искомый API дляинициализации USSD запросов найден.
MobileSubstrate — перехват вызовов
MobileSubstrate позволяет перехватить C и ObjC вызовы и выполнить необходимыйкод. Так, Winterboard перехватывает open и возвращает не оригинальные файлы сграфикой, а файлы из каталогов текущей темы.
Функции:
инъекция в любую ARM/Thumb C-функцию
инъекция в любой Objective-C метод
загрузка пользовательских библиотек или бандлов
Блокируем USSD интерфейс в SpringBoard
Задача: заблокировать отображение USSD-окон в SpringBoard.получим список классов с помощью class-dump и изучим их. Нашей целискорее всего соответствует класс SBUSSDAlert.с помощью анализа бектрейса у методов этого класса (используя брейкпоинтыв gdb и адресам полученным из class-dump), что в методе+registerForAlerts происходит регистрация SpringBoard в системе событийCoreTelephony.
SpringBoard inside
Компилируем код без 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
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
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 $<
Плагин для SpringBoard
Можно встроится в какой-то из UIView от SpringBoard (например в lock–screen), илипросто сделать плагин для SBSettings:
Итак, для того, чтобы рассказать Вам про Jailbreak мы:
farcaller@ покурил ARMARM и дампы xxd
proger@ наконец залез в исходники XNU
одели костюмы (:P)
© 2009 Hack&Dev Team