Судя по статистике моего сайта, наибольшее количество посетителей интересует роутер ASUS RT-G32 и все что с ним связано. Дабы уважить моих уважаемых посетителей, решил снова взяться за свой роутер.
В данной статье я бы хотел рассказать как я выковырял из родной асусовской прошивки ядро и корневую файловую систему. Поехали.
У меня на борту роутера стоит асусовская RT-G32_V3.0.2.1_RU09.bin прошивка. Первое что я сделал – это перезагрузил роутер и зашел в RedBoot. В нем начинаем сбор информации.
Самое интересное в данной ситуации – это
rootfs 0xBFC30000 0xBFC30000 0x002F0000 0x00000000
vmlinux.bin.l7 0xBFF20000 0x80041000 0x000B0000 0x80041400
rootfs – это коневая файловая система, в которой и содержится веб морда, пароли, конфигурационные скрипты и прочие интересные вещи. Прописана она по адресу 0xBFC30000 и выделено под нее 0x002F0000 байт (~3Мб).
vmlinux.bin.l7 – это упакованное linux ядро. Оно прописано по адресу 0xBFF20000 и имеет сравнительно не большой размер 0x000B0000 (~700Кб).
Первая глупая мысль была, это сдампить вручную оба раздела. Но немного попытавшись, я отбросил эту идею. Следующей и правильной мыслью было извлечь эти данные из прошивки которую нам любезно представляет официальный сайт asus. Но перед тем как сделать это, надо было набрать еще информации.
RedBoot> fconfig -l
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec -c «root=/dev/mtdblock1 rootfs=squashfs»
Собственно здесь мы видим каким образом RedBoot загружает linux. Сперва он загружает в память ядро, а затем запускает его с параметром «root=/dev/mtdblock1 rootfs=squashfs», где /dev/mtdblock1 – это собственно корневая файловая система, а squashfs – это тип этой самой корневой файловой системы.
Следующее что я сделал, это узнал с каких байт начинается ядро
RedBoot>x -b 0xBFF20000 -l 0x0F
И получил сигнатуру :
BFF20000: 5D 00 00 80 00 00 00 1C 00 00 00 00 00 00 00 6F |]…………..o|
Зная ее я уже мог от чего-то отталкиваться в асусовской прошивке.
Так как корневая файловая система имеет тип ФС squashfs, мне уже было известно, что такие файлы могут начинаться с сигнатуры sqsh. На данном этапе, мы набрали достаточное количество информации чтобы попробовать выловить нужные нам файлы из прошивки.
Качаем прошивку с официального сайта и переводим ее в hex, чтобы с ней было легче работать.
$ hd RT-G32_V3.0.2.1_RU09.bin > RT-G32.txt
Извлекаем ядро.
Далее начинаем искать нужные нам сигнатуры внутри. Если прошивка дополнительно ничем не ужимается и не шифруется, то все должно лежать на виду:
$ grep -i ‘5D 00 00 80’ RT-G32.txt
00000140 00 09 00 00 5d 00 00 80 00 00 00 1c 00 00 00 00 |….]..─……..|
Это и есть начало сигнатуры ядра. Вспоминая длину всего отведенного по ядро раздела (B0000), попробуем вынуть его из прошивки:
$ dd if=RT-G32_V3.0.2.1_RU09.bin of=vmlinux.bin.l7 bs=1 skip=324 count=720896
Разъясню все по порядку. С помощью утилиты dd копирую из файла RT-G32_V3.0.2.1_RU09.bin в файл vmlinux.bin.l7, где размер блока равен 1 байту (bs=1), при этом пропускается первые 324 байта (144h = 324 – это адрес начала сигнатуры ядра), и копирую только 720896 (B0000h = 720896) байт, а не весь файл.
Полученный в итоге файл представляем собой упакованное ядро. Его можно извлечь с помощью 7zip :
$ 7z x vmlinux.bin.l7
И на выходе получим linux.bin – собсвенно linux ядро. Хотя можно этого и не делать.
Извлекаем rootfs.
Как я уже говорил, rootfs мы будем искать по сигнатуре sqsh.
$ grep -i ‘sqsh’ RT-G32.txt
00090180 00 30 00 00 73 71 73 68 00 00 02 f5 00 1e 4e 9c |.0..sqsh…У..N°|
Как видим, сигнатура присутствует. Пробуем ее извлечь по той же технологии.
$ dd if=RT-G32_V3.0.2.1_RU09.bin of=rootfs bs=1 skip=590212 count=3080192
Где 590212 = 90184h, начало сигнатуры sqsh, а 3080192 = 2F0000h, то есть длине отведенного под rootfs пространства на флеш карте роутера.
Однако в ответ получаем, что файл RT-G32_V3.0.2.1_RU09.bin закончился. Оказывается файл самой прошивки по размеру меньше, чем запрашиваемое нами count=3080192. С тем чтобы узнать истинный размер rootfs пришлось малость повозиться, погуглить и просто поразмыслить.
Собственно размер этого самого rootfs оказался в предыдущей строке в файле RT-G32.txt (тоесть в хексдампе):
$ grep -i ‘00090170’ RT-G32.txt
00090170 00 00 00 02 bf cc 00 00 00 00 00 00 00 1e 50 00 |….©л……..P.|
Выделенный жирным шрифтом фрагмент и есть размер корневой файловой системы. В подтверждение этому, размер ровно доходил до сигнатуры END в файле прошивки:
$ grep -i ‘END’ RT-G32.txt
0019e2c0 86 67 0f c0 2e 98 36 54 45 6e 64 40 44 c3 b3 82 |├g.ю.≤6TEnd@DцЁ┌|
00275180 00 00 00 00 26 47 a1 41 00 00 00 00 45 4e 44 2e |….&G║A….END.|
За которой и фактически заканчивался файл.
Немного изменив команду получаем:
$ dd if=RT-G32_V3.0.2.1_RU09.bin of=rootfs bs=1 skip=590212 count=1986560
Где 1986560 = 1E5000h .
На выходе получим корневую файловую систему rootfs, которая сжата LZMA (это уже было выяснено позже).
Что дальше, читайте во второй части этой статьи.
Вторая часть
Человек_Разумный ©
1 comment
RSS / trackback