ASUS RT-G32 : разбираем прошивку. Часть первая.


Tagged , , , ,

Судя по статистике моего сайта, наибольшее количество посетителей интересует роутер 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 (это уже было выяснено позже).
Что дальше, читайте во второй части этой статьи.
Вторая часть

Человек_Разумный ©

Мой блог находят по следующим фразам

Share:

1 comment

RSS / trackback

Respond

  1. как узнать root « Эхо блогосферы

    on 27.09.2010 at 21:11

    […] Человек_Разумный пишет: Сперва он загружает в память ядро, а затем запускает его с параметром «root=/dev/mtdblock1 rootfs=squashfs», где /dev/mtdblock1 – это собственно корневая файловая система, а squashfs – это тип этой самой корневой файловой системы. Следующее что я сделал, … С тем чтобы узнать истинный размер rootfs пришлось малость повозиться, погуглить и просто поразмыслить. Собственно размер этого самого rootfs оказался в предыдущей строке в файле RT-G32.txt (тоесть в хексдампе): … […]