Модификация файловой системы Ubiquiti Nanostation M2 на примере прошивки версии 5.5.4

Модификация файловой системы Ubiquiti Nanostation M2 на примере прошивки версии 5.5.4

Все работы проводились в виртуальной машине (на ней был установлен arch linux).

Цель: добавление произвольного файла в готовую прошивку.
Результат: был успешно добавлен и запущен исполняемый файл

Все работы проводились в виртуальной машине (на ней был установлен arch linux). Файл прошивки XM-v5.5.4.build16501.bin, основная информация о строении прошивки была получена отсюда. Собрать свою прошивку из SDK у меня не получилось. Итак, вот что показывает binwalk

Тут надо отметить, что binwalk немного неправильно показывает смещения заголовков разделов (Ubiquiti partition header). К этим смещениям необходимо добавить 8 байт (4 байта crc32 предыдущей части и 4 байта дополнение 0х00000000). То есть смещение первого partition header’a будет не 260, а 268, соответственно второй parition header расположен по смещению 1232900. Из скриншота видно, что размер файловой системы, в данном случае, составляет 5391801 байт, прибавив к этому размеру смещение ф.с. в файле получим 6624757 (1232956+5391801), однако следующая секция (gzip compressed data) начинается со смещения 6869116. Значит между squashfs и gzip compressed data имеются еще какие-то данные. Как потом оказалось, эти данные важны для построения модифицированной прошивки. Опираясь на ссылку выше, а так же эксперименты были найдены следующие смещения:

1232956-6624757 – squashfs
6624757-6869052 – dead code (область заполненная 0x0 с иногда встречающимися 0xdead 0xc0de)
6869052-6869056 – crc32 2-го partition header’a, squashfs и dead code
6869056-6869060 – 0x00000000
6869060-6869116 – заголовок Exec script
6869116-6896729 – gzip compressed data
6896729-6896733 – “END.” (видимо окончание firmware header)
6896733-6896737 – crc32 сегмента со смещением 0 по смещение 6896729 включительно
6896737-6896741 – 0х00000000.

Для создания полноценной и рабочей прошивки необходимо еще одно число. Как выяснилось расположено оно в partition header.

 

Это размер секции. В данном случае он равен размеру squashfs + размер dead code.
Приступим к разбору оригинального файла. Из файла было получено несколько частей:

header  (0-1232900) – часть остается неизменной


partition_header (1232900-1232956) – заголовок для секции squashfs + dead code

fs.img (1232956-6624757) – непосредственно squashfs

dead_code (6624757-6869052) – dead code

gzip_data (6869060-6896729) – gzip данные остаются неизменными

Теперь приступим к распаковке файловой системы

После выполнения  этой команды появился каталог squashfs-root.
Да, для работы со squashfs в arch'e нужно поставить пакет squashfs-tools.

Далее скомпилировал “hello world” под платформу MIPS и скопировал получившийся файл hello в каталог squashfs-root/bin/. Для теста достаточно, можно приступать к сборке прошивки.

Запаковываем обратно файловую систему

Меняем размер секции в partition_header

Новый размер=размер myfs+размер dead_code=5455727+244295=5700022=0x56f9b6

Склеиваем вместе partition_header, myfs и dead_code. Вычисляем crc32 секции и записываем в конец с дополняющими нулями.

Теперь склеиваем header, final_part и gzip_data, так же считаем crc32 и записываем хвостовую часть в итоговую прошивку

Заходим по ssh на устройство и выполняем hello

Как видно, файл успешно отработал в модифицированной прошивке.  А теперь ложка дегтя: судя по всему последние 4 байта в partition_header указывают на максимальный размер секции squasfsh+dead_code, соответственно в данную прошивку мы можем запихнуть не более 1Мб своих данных. Хотя эта информация не проверялась.

Тени в интернете всегда следят за вами

Станьте невидимкой – подключайтесь к нашему каналу.