Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter Хакер в ВКонтакте Приложение Хакер для Facebook Хакер на Formspring.me
Журнал Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English
Трюки с phpinfo Трюки с phpinfo
Совсем недавно в паблике появилась информация о новом интересном подходе к эксплуатации уязвимостей класса LFI с помощью бесполезной на первый взгляд функции phpinfo() и временных загрузочных файлов. Берем на вооружение этот полезный прием....
Интервью с создателем NGINX Игорем Сысоевым Интервью с создателем NGINX Игорем Сысоевым
Легкий веб-сервер NGINX буквально только что вышел на 2 место по популярности в интернете. А незадолго до этого создатель NGINX привлек 3 млн. долларов инвестиций и основал одноименную компанию. В общем, поводов для общения с Игорем Сысоевым у нас была масса....

Ebook-потрошитель: секреты Sony Book Reader PRS-505

Bookmark and Share

Вокруг нас полно гаджетов с Linux на борту, и никто не мешает учиться на ошибках профессионалов, вскрывая гаджеты и изучая. Мной была куплена "игрушка" - книгочиталка на электронных чернилах Sony Book Reader PRS-505. Вдоволь начитавшись Хайнлайна, я полез во внутренности девайса, изучить программную и аппаратную часть. Эта статья - результат увиденного.

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

Оффлайн

Итак, сначала проведем "оффлайновый осмотр внутренней программы. Производитель электронных книг периодически выкладывает на официальный сайт свежие прошивки, исправляющие старые глюки и добавляющие новые. Чтобы не потрошить содержимое flash-карточек устройства, просто скачаем новую версию. Это программа, которую производитель нам предоставил для перепрошивки ридеров. Она содержит образ файловой системы для заливки в устройство. Экзешник - всего лишь самораспаковывающийся архив Win-Zip, и его совсем необязательно запускать, достаточно просто распаковать linux-утилитой unzip:

$ unzip PRS-505\ Updater\ 1.1.00.18040.exe
$ ls
checksum eBookMSCDeviceUpdater.dll fsk.dll kconfig.xml msvcr71.dll ssleay32.dll
cramfs.Fsk.img eBookUpdater FskImage.dll libeay32.dll PRS-505 Updater 1.1.00.18040.exe USBDLL.dll
cramfs.Rootfs.img eBookUpdater.xsb Fskin.dll MSCEncComm.dll PRS-505 Updater.exe
DriveManager.dll FskCore.xsb FskPower.dll msvcr70.dll raw.BootImg.img
$ rm PRS-505\ Updater\ 1.1.00.18040.exe

Помимо вспомогательных dll-ек и конфигурационных файлов xml (к ним мы еще вернемся), в распакованном архиве будут жить нужные образы ФС, которые и заливаются в итоге в устройство. Они имеют расширение *.img. Пропустим эти имиджи через программу file и посмотрим, что она о них думает:

$ file *.img
cramfs.Fsk.img: Linux Compressed ROM File System data, little endian size 65536 CRC 0xc3e97789, edition 2768907732, 3306537355 blocks, 1718735798 files
cramfs.Rootfs.img: Linux Compressed ROM File System data, little endian size 65536 CRC 0xdb11801f, edition 3444324402, 2364302859 blocks, 491549572 files
raw.BootImg.img: DOS executable (device driver) for DOS

Содержимое третьего файла показалось мне подозрительным, это был явно не ДОС-драйвер. Размер - 480 тысяч байт, почти полностью забит единичками (для более быстрого залива во флеш, как я полагаю) и имеет некоторое количество вкраплений чего-то малоосмысленного. Сначала я решил, что это какой-то загрузчик (истинное назначение станет ясным позднее).

Файлы cramfs.Fsk.img и cramfs.Rootfs.img, очевидно - образы файловых систем в формате CramFS. Попробуем их смонтировать:

$ mkdir Fsk.FS
$ cd Fsk.FS
# mount -t cramfs -o loop ../cramfs.Fsk.img .

Внутри - каталог sony/ebook, а в нем - подкаталоги application, bin и FONT. Заглянем в первый и увидим кучу динамических библиотек, скомпилированных под архитектуру armel, и кучку вездесущих xml-файлов. В каталоге /bin - 4 бинарника, а в FONT - шрифты.

Теперь примонтируем файл cramfs.Rootfs.img. В нем - полноценная файловая система GNU с каталогами: bin, Data, dev, etc, home, lib, mnt, opt, opt0, opt1, proc, root, sbin, tmp, usr, var. Что же интересного здесь можно накопать? Ну, во-первых, содержимое файла /etc/issue даст нам версию окружения Linux - коммерческий проект MontaVista версии 3.0. Файлы /etc/passwd и /etc/sudoers расскажут о единственном пользователе этой системы: "libro" с зашифрованным паролем "/ET3mqgcE1NTQ". Подкаталог /etc/rc.d обозначит все сервисы и демоны, которые запускаются в устройстве. Здесь все стандартно, если бы не спрятавшийся в rcS.d скрипт S20libromount. Заглянув в него, можно узнать, что он монтирует файловые системы (в /opt, /opt0 и /opt1), подгружает драйвера экранчика, звука, usb-storage и flash-карточек, выводит наружу приветствие и устанавливает дефолтное время. В общем, все, от чего зависит книгочиталка, делается здесь.

Я чуть было не ушел из подкаталога /etc дальше по файловой системе, но в последний момент заметил скриптик rc.d/rc3.d/S98librostart, который запускает файл tinyhttp.sh, живущий в предыдущей изученной нами файловой системе. А вот здесь уже интересно. Зачем устройству, не имеющему никакого сетевого интерфейса, какой-то http? Ладно, берем на заметку и ползем по файловой системе дальше.

Некоторый интерес вызвал драйвер хваленых электронных чернил, живущий по адресу /lib/modules/2.4.17_n12/kernel/drivers/video/etrackfb.o. Поиск последовательностей ASCII-символов в этом двоичном файле (команда "strings etrackfb.o") дал следующий результат:

kernel_version=2.4.17_n12
author=E Ink
description=8track FrameBuffer Driver
VGA e-ink 600x800

Следовательно, электронные чернила представляются Линуксу как графический Framebuffer-совместимый дисплей! Так что, если захотим похачить устройство и заставить выводить на экран что-то, отличное от книжек, – надо лишь направлять вывод нашей графической программы в /dev/fb0. Проявляется и смысл файла raw.BootImg.img - это то, что отсылается во фреймбуффер при загрузке ОС, то есть картинка с логотипом и надписью "Starting Up…". Размер файла как раз равен 800x600 (=480000), по байту на пиксель.

Одно из особенностей устройства - разработчики физически поместили на разные файловые системы собственно GNU (как универсальный софт) и устройство-зависимую оболочку Fsk - то, что и делает букридер букридером. Сделано это чтобы можно было быстро заливать обновления к программе чтения, не трогая систему целиком и повышая ее безопасность.

Разбираем…

Внутренности устройства уже давно исследованы товарищами igorsk, boroda и остальными энтузиастами с форума www.the-ebook.org. Нам осталось только повторить их подвиг, благо, инструкция по разборке там имеется.

С замиранием сердца разбираю своего хорошего друга и внутри обнаруживаю:

  • Центральный процессор FreeScale (Dragonball) MX-1 с архитектурой ARM926
  • Микросхема NAND-Flash памяти Samsung (256 Мb)
  • Микросхема NOR-Flash памяти Spansion (2 Мb)
  • Две микросхемы оперативной памяти Samsung
  • Контроллер карт SD/MMC+MemoryStick Ricoh
  • Контроллер дисплея на FPGA Actel ProASIC3
  • Цифро-аналоговый преобразователь для вывода звука
  • Контроллер USB Epson S1R72V17
  • Распайка под проприетарный отладочный разъем (100 ножек), маркирована как CN1501

Итак, никакого чуда или крутой инженерной находки внутри букридера нет. Видим микросхему NOR-памяти, в которой, скорее всего, живут загрузчик и ядро, потому как именно этот тип Flash умеет читать отдельно заданный байт (Random Access). Рядом – NAND-Flash, где, очевидно, живут файловые системы и, собственно, сами книжки. Лично меня порадовала SDRAM-память в маленьких BGA-корпусах. Тем самым инженеры нехило сэкономили место на плате.

Вообще, компоновщикам платы и дизайнерам корпуса моя похвала и зависть. Все подогнано неимоверно точно, и нигде не заметно расточительства. Впихнуть в корпус что-нибудь, кроме того, что в нем есть, мне показалось невозможным. Короче, ни добавить, ни отнять.

Разберемся с отладочным разъемом. Очевидно, на него выводятся JTAG-интерфейсы микросхем + какие-нибудь порты, типа последовательного отладочного UART'а с центрального процессора. Так и есть. Ребята с форума, названного выше, уже сделали грязную работу, в виде тыкания осциллографом, и вычислили принадлежащие DBG-порту ножки. Осталось только к ним подпаяться. Припаиваем тонкие серебряные провода к 6(Transmit) и 7(Receive) пинам, а также не забываем про "земляной" контакт, который можно взять или от 5-го пина разъема или – просто схватившись за корпус устройства. Через переходник RS-232/UART подключаем к COM-порту компьютера.

Онлайн

Включаем устройство. Если порт настроен правильно и все запаяно аккуратно, то наблюдаем лог загрузки Линукса. Как загрузка закончена, – логинимся с узнанными из /etc/passwd реквизитами (libro:librie). Система пускает нас и вываливает сообщение:

### fskLoad
### fskLoaded
latest nblconfig read from 0x0003b800
latest nblconfig written to 0x0003c000
#### xs_switcher_usbWatcher_endUSBThread
# warning: global instead of local!
# warning: global instead of local!
SYSNPM: sysnpm_pm_callback():163 Mem, CPU stopping...

После чего перестает отвечать на команды! Все хорошо, так и должно быть, это процесс-оболочка tinyhttp заметила неактивность процессора и вырубила его, чтобы сэкономить аккумулятор. "Расшевелить" процессор можно, понажимав на кнопки громкости. Работать так сложно, поэтому убиваем лишнее:

$ killall tinyhttp.sh
$ killall tinyhttp

С этого момента нам доступна настоящая, полноценная система GNU/Linux на ядре 2.4!

Из лога загрузки (команда dmesg) можем узнать многое об аппаратной части девайса: например, что размер оперативной памяти 64 Mb и что flash-память разбита на очень много разделов на все случаи жизни. Взглянем на характеристики процессора:

root@(none):/proc# cat /proc/cpuinfo

Processor : ARM/CIRRUS Arm920Tsid(wb) rev 0 (v4l)
BogoMIPS : 98.09
Features : swp half 26bit
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format A
Cache unified : harvard
...
Hardware : Motorola DragonBall MX1 (eBook-2)

Выходит, контроллер работает на частоте 100 МГц и имеет архитектуру ARM9.

А вот что Линукс примонтировал:

root@(none):/var# mount

/dev/root on / type cramfs (rw)
proc on /proc type proc (rw)
tmpfs on /dev/shm type tmpfs (rw)
tmpfs on /tmp type tmpfs (rw)
tmpfs on /var type tmpfs (rw)
tmpfs on /etc type tmpfs (rw)
/dev/mtdblock10 on /opt1/keys type cramfs (rw)
/dev/mtdblock11 on /opt1/info type cramfs (rw)
/dev/mtdblock15 on /opt type cramfs (rw)
/dev/mtdblock16 on /opt0 type jffs2 (rw)
devpts on /dev/pts type devpts (rw)

Кстати, то, что имеет файловую систему cramfs – доступно только для чтения. Особенность файловой системы, что бы там драйвер себе ни думал.

Оболочка

Как среди файлов прошивки устройства, так и в приложении, поставляющемся под Windows, можно заметить множество xml-файлов, как один, начинающихся со строчки "<fsk xmlns="http://www.kinoma.com/Fsk/1">". Это файлы для оболочки, созданной компанией Kinoma и приобретенной Sony (что мелькает в "титрах"). В общем, бинарник tinyhttp парсит эти файлы и делает все, что ридеру нужно: рисует интерфейс, подключает библиотеки для разбора файлов, выполняет скрипты и т.д. Назвали его, конечно, странновато, но где-то даже логично. Нужную функциональность можно добавить в систему, не прикасаясь к компилятору. Пишем по образу и подобию новые конфиги или правим существующие, потом добавляем шрифты, простенькие игры - это возможно! "Язык" xml-файлов не очень сложен, так что все в наших руках.

Энтузиасты в интернете уже создали альтернативные прошивки с пакетами локализации и даже упаковали их в CramFS-образы. Среди рекомендуемого - более читабельные шрифты, симпатичные иконки и часы в углу экрана. Можно не спешить заламывать конфиги, а сначала посмотреть, что предлагает сообщество. Но если хочется чего-то своего, то расскажу, как создать образ на примере заливки новых шрифтов.

Ttf-шрифты лежат в каталоге /opt/sony/ebook/FONT. В идеале, их надо переименовать в tt0003m_.ttf,tt0011m_.ttf,tt0419m_.ttf, а также дать внутренние имена:

Font family - Swis721 BT, Dutch801 Rm BT, Courier10 BT
Font subfamily - Roman, Roman, Roman
Full font name - Swis721 BT Roman, Dutch801 Rm BT Roman, Courier10 BT Roman

Именно такие имена прописаны в конфигах application/kconfig.xml и application/resources/scripts/main.xml. По образу и подобию написанного там можно изменить предложенные стили на свои:

<style font="Courier10 BT">
// Стиль для показа часов: жирный, размер 22
<style id="time" size="22" style="bold" color="#FFFFFF"/>
</style>
<style font="Dutch801 Rm BT">
// Текст размером 12
<style id="text" size="12"/>
</style>

В тех же конфигах, играясь со скриптами и разметкой, можно добавить возможностей в оболочку. Финальный аккорд - пакуем новую ФС в образ:

# mkfs.cramfs ./new_opt ./new_opt.img

Перепрошивка

Просто так заменить нужный файл на обновленный сжатая файловая система cramfs не позволяет. Надо будет ее распаковать на PC, внести изменения и с помощью mkfs.cramfs запаковать обратно, что и было проделано в предыдущем разделе. Товарищ igorsk написал набор скриптов (Universal Flasher, качать отсюда). С их помощью можно заменить старый образ на созданный, а также (внимание!) заменять отдельные файлы, если хочется поэкспериментировать, не мучаясь с компоновками образов. Просто скидываем кучку файлов на Flash-карточку, заменяем образ new_opt.img на наш, вставляем в букридер и перезагружаемся. Если все прошло хорошо, и ошибок в конфигах нет, то мы заимеем обновленный интерфейс.

Чаще всего при заливке испорченного образа система не выходит из строя и дает нам шанс исправить проблему. Хотя иногда оболочка повреждается настолько, что без тяжелой артиллерии (подпаивания к отладочному порту) не обойтись. Но ведь остальная файловая система с GNU не убита, поэтому с полноценной консолью несложно перепрошить устройство рабочей прошивкой вручную, предварительно залив на флешку соответствующий образ (приведенная ниже последовательность действий предложена boroda):

// Создаем временный диск в памяти объемом 32 Мb
root@(none):~# mount -o remount -t tmpfs -o size=32m /dev/shm /tmp
// Монтируем Flash-карточку
root@(none):~# mkdir /tmp/sd_card
root@(none):~# mount /dev/sdmscard/r5c807a1 /tmp/sd_card
// Вынимаем оттуда образ во временный диск
root@(none):~# cp /tmp/sd_card/new_opt.img /tmp
// Проверяем контрольную сумму
root@(none):~# md5sum /tmp/new_opt.img
// Проприетарный софт Sony для низкоуровневой работы с NAND-flash карточками
root@(none):~# /usr/local/sony/bin/nblsdm delete Fsk
root@(none):~# /usr/local/sony/bin/nblsdm create -i /tmp/new_opt.img -d 1 Fsk
// Сравниваем залитое
root@(none):~# /usr/local/sony/bin/nblsdm cmp -i /tmp/new_opt.img Fsk
root@(none):~# /usr/local/sony/bin/nblconfig -ksel normal
root@(none):~# sync
root@(none):~# reboot

Простор для экспериментов

Привычка разбирать попадающиеся под руку (и собирать обратно!) гаджеты добавляет опыта и помогает при создании чего-то своего. Мы взяли устройство для чтения электронных книг, но вместо чтения стали исследовать его программную и аппаратную суть. Ладно спроектированный и созданный на базе знакомого и изученного Linux, Sony Book Reader PRS-505 предоставляет широкий простор для экспериментов и творчества.

INFO

UART - этот простой механизм позволяет последовательно передать несколько байт. В одном из предыдущих номеров журнала Сергей Долин подробно написал о нем в рубрике "Фрикинг".

Sony Book Reader PRS-505 - карманный компьютер, имеющий вместо стандартного ЖК или OLED-дисплея так называемый E-ink дисплей на электронных чернилах.

WWW

Хороший сайт про электронные книжки с замечательным форумом - www.the-ebook.org.

Еще немного сведений о внутренностях девайса: wiki.mobileread.com/wiki/Sony_Reader_hack.



Теги: Linux , взлом , фрикинг





СЛЕДУЮЩИЕ СТАТЬИ
Китайские закладки: непридуманная история о виртуализации, безопасности и шпионах
Отчеты о сбоях от Apple помогают хакерам создавать эксплойт для джейлбрейка
AntiHASP: эмулируем ключ аппаратной защиты HASP
Компании опаздывают с безопасностью встраиваемых устройств
Ситибанк не играет в кости: уязвимость TAN кодов
Прав достаточно: 8 приемов для обхода групповых политик в домене
Чем больше эксплоитов выставлено на продажу, тем выше уровень безопасности
PHP-дайвинг: низкоуровневый поиск уязвимостей в веб-приложениях
SCADA под прицелом: анализ защищенности АСУ ТП
Hack TV: взлом телевизора и изучение его кишок на примере Samsung LE650B
ПРЕДЫДУЩИЕ СТАТЬИ
Хакерское радио: спутники армии США на службе пиратов
Взлом метро: копирование и подделка билетов метрополитена
Filter::Decrypt: расшифровка вслепую
Программно-аппаратные угрозы или хрупкий мир глазами железячника №2
Программно-аппаратные угрозы или хрупкий мир глазами железячника №1
Cold Boot Attack: вспомнить все
Атакуем кучу в xBSD: техника переполнения кучи в Free/Net/OpenBSD
Витой снифер: как прослушать витую пару
Взлом транспорта: Орех 4.0 в российских условиях
Кардшаринг: ключ на раздачу
ОБСУЖДЕНИЕ СТАТЬИ
Логин:
Пароль:
Если у вас есть форумный логин - вы можете использовать его, иначе анонимный гостевой доступ.

Для оставления комментария вы можете зарегистрироваться по упрощенной процедуре.

Обсуждение этой статьи на forum.xakep.ru
Для отправки сообщения введите код, указанный на картинке
Сообщение

UserГость
10.12.2009 9:56:59
Ответить Ссылка
Спасибо.
UserГость
10.12.2009 12:05:11
Ответить Ссылка
Отменная статья, спасибо!
UserГость
10.12.2009 14:54:08
Ответить Ссылка
Лучше бы помогли товарищам запустить прошивку PRS-600 на PRS-700
UserГость
14.12.2009 13:06:02
Ответить Ссылка
Чичас продажи PRS-505 подозрительно вырастут... ну, если и не подозрителдьно, то на одну штучку-то уж точно ;) Давно хотел КПК с e-ink (и спроектировал бы), да дисплей отдельно пока фиг кто продаст.
Дык лучше ж из полуготового сделать :)
UserГость
10.04.2010 16:04:03
Ответить Ссылка
Я не в курсе, прочитает ли кто этот коммент, но мне, как автору статьи, хочется ответить.

>Лучше бы помогли товарищам запустить прошивку PRS-600 на PRS-700
Пусть присылают - помогу :).

>Давно хотел КПК с e-ink (и спроектировал бы), да дисплей отдельно пока фиг кто продаст.
Дисплеи отдельно продаются, хотя бы на том же
the-ebook.org, но вот с контроллером для них уже сложнее.




Keywords: zPOSTz zHOMEz, zHACKz, zOTHERHACKz, zINFOz, zYANDEXz z50435z
Для Авторов: edit Lock delete Lock



    Rambler's Top100