В общем, root-доступ на телефон получен, дальше можно ковырять изнутри на живой системе, там много всего интересного. Но в моем случае проще пока разбираться с самой прошивкой, так как на телефоне нет нужных инструментов, да и телефона у меня теперь нет, так что остается только разбираться с этой кучей бинарного мусора.
Понятно, что внутри устройства Unix, понятно, что есть какие-то родные сердцу ELF-ы в apps, но это не очень весело, так как есть еще и другие файлы - сигнатура DEADBEEF, оказывается, есть не только у Java-машины, но и у других файлов. Но только машина еще и упакована, а при старте телефона распаковывается в ram-диск и запускается специальной утилитой zrun. А вот некоторые другие неупакованнные файлы тоже имеют такую сигнатуру, и, похоже, являются исполняемыми файлами, такими же как и ELF-ы. В качестве примера можно привести sshd. При этом никаких helper-ов на запуск таких файлов нет, тот же sshd запускается из inetd.conf. Это говорит о том, что ядро само умеет запускать такие файлы. Значит, пришло время разбираться с ядром.
Предполагая, что ядро находится в cnu41*.sbn (ну а где ему, в конце концов, еще находиться), я начал исследовать файлы этого пакета.
Поначалу .raw1, вытаскивать который из пакета я научил последнюю версию распаковщика, не вызывал особого энтузиазма, потому что практически ничего интересного в нем не было. Но потом, пройдясь по нему strings, я увидел, что он говорит про всякий там compressed data и tail garbage, а значит это скорее всего самораспаковывающийся архив. После некоторого времени блуждания по заголовкам я обнаружил кандидата на content offset: по смещению 0x60 лежит dword, указывающий куда-то в файле. Что же находится по указанному в 0x60 смещению? А там находится 1F 8B 08 08, что есть ничто иное, как сигнатура gzip :) А значит файл с образом - это распаковщик с присобаченным к нему контентом.
Ну дальше распаковать дело нехитрое, без всякой уличной магии после распаковки мы получаем некий образ. Поначалу я думал, что это ядро. Но потом, в процессе анализа содержимого файла, я пришел к выводу что это никакое не ядро, а скорее всего образ файловой системы, так как там содержатся такие же файлы с сигнатурой DEADBEEF (как у исполняемых файлов внутри телефона) и ст,роки LoadHdrStart (как у изначально упакованного образа FS). Осмотр файла показывает наличие строк cffs_* в сообщениях об ошибках и таблицах экспорта, очевидно, cffs - это файловая система телефона, Cisco Flash File System. Кто-то даже написал распаковщик для нее под Linux, но он работает только будучи использованным на mtd-устройствах, а у меня такого устройства нет под FreeBSD, да и флэшки от цискиного роутера тоже :) Таблица символов ядра там тоже есть, много всяких разных интересных функций, но на них пока остается только посмотреть. Там вообще много на что есть посмотреть, особенно завораживают системные сообщения =)
Кстати, как я и говорил в предыдущих статьях, телефоны 7941/7961, а значит и некоторые другие модели этой серии, умеют делать аварийное восстановление в случае неудачной или отсутствующей прошивки. Это подтверждается анализом сообщений, которые можно прочитать в виде строк. Кроме того, похоже внутри этого образа есть даже минимальная система, которая может работать сама по себе.
Думаю, ранее описанные в других статьях компоненты прошивки распаковываются на разные mtd-устройства внутри телефона, и монтируются в нужные места FS. В случае отсутствия каких-то компонентов или неправильной загрузки, телефон может сделать fallback на имеющуюся версию. Как-то так.
Для того чтобы продолжить исследования, конкретно не хватает знаний по архитектуре файловых систем и приемам реверса, а еще знания ассемблера и архитектуры исполняемого кода для MIPS. Но приходится обходиться тем, что есть.
