Сейчас на форуме: -Sanchez- (+8 невидимых)

 eXeL@B —› Основной форум —› Модификация прошивки OpenWRT
Посл.ответ Сообщение

Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 05 января 2018 06:22 · Поправил: murder
· Личное сообщение · #1

Имеется образ OpenWRT. Нужно сменить MAC-адрес (через telnet не получится, т.к. squashfs - uci commit выдаёт I/O error, файл /etc/config/network открывается только для чтения). Файловую систему распаковал через 7-zip. Чем запаковать обратно? Пробовал mksquashfs с параметром xz - файл получается больше, чем оригинал.

Кроме того нужно поменять версию ПО, производителя и модель устройства - расположены в самом начале файла. После редактирования файл не проходит проверку. Тут назревает самый главный вопрос: по каким смещениям хранятся контрольные суммы и как их считать?



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 05 января 2018 06:49
· Личное сообщение · #2

http://192.168.1.1/ Справа сверху кликнуть Administration Network->Interfaces->Wlan wan->кнопка edit В поле -- Additional Field -- выбрать MAC-Address Кнопка [Add]

| Сообщение посчитали полезным: Gideon Vi

Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 05 января 2018 08:55
· Личное сообщение · #3

Web-интерфейс там не стандартный.




Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 05 января 2018 09:07
· Личное сообщение · #4

у тебя стоковая прошивка стоит же. ты сначала ВРТ залей, а потом уже дальше танцевать



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 05 января 2018 09:15 · Поправил: murder
· Личное сообщение · #5

Так мне в стоковой надо поправить. Стоковая это и есть OpenWRT, только допиленная производителем. Когда через telnet на неё заходишь - видно приветствие OpenWRT.

Добавлено спустя 2 минуты
Вот сам девайс - ZISA op151S


Добавлено спустя 45 минут
Вывод binwalk
Code:
  1. 0        0x0      Copyright string: " 2000-2010 T&W. All rights reserved.rved."
  2. 1024     0x400    uImage header, header size: 64 bytes, header CRC: 0xFFCC4335, created: Thu Oct 23 10:41:47 2014, image size: 1184490 bytes, Data Address: 0x80002000, Entry Point: 0x80002000, data CRC: 0x46E9464C, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "OpenWrtLinux-3.10.12-svn24709"
  3. 1088     0x440    LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3481980 bytes
  4. 1311232  0x140200 Squashfs filesystem, little endian, version 4.0, compression:lzma (non-standard type definition), size: 2354781 bytes,  727 inodes, blocksize: 262144 bytes, created: Tue May  9 11:47:50 2017

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



Ранг: 46.1 (посетитель), 1thx
Активность: 0.02=0.02
Статус: Участник

Создано: 05 января 2018 10:34 · Поправил: carver
· Личное сообщение · #6

привет.

а эта шняга с микротиком работает ?
а задешево бывает, или как на амазоне, 109 баксов + ship ?

а что на наге говорят ?
еще нет SFP программатора с поддержкой GPON ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 января 2018 10:42
· Личное сообщение · #7

если образ openwrt - значит нужно идти на сайт и форум openwrt
и еще здесь посмотреть http://www.lan23.ru/forum/forumdisplay.php?f=27



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 05 января 2018 10:42
· Личное сообщение · #8

С микротиком работает. Задёшево не видел.

Пытаюсь повторить опыт испанских братьев по разуму.

Добавлено спустя 1 час 20 минут
Продублировал на наге и на форуме OpenWRT.



Ранг: 46.1 (посетитель), 1thx
Активность: 0.02=0.02
Статус: Участник

Создано: 05 января 2018 14:16
· Личное сообщение · #9

а что испанцы, морозятся ?

просто попроси пересобрать тебе прошивку.
обычно не отказывают же, и для них это проще, чем писать мануал.

если самому пересобирать, то кроме опенврт, нужно вникать в формат от ZISA,
хотя там вроде и не сложно, но если не разберешся,
и никто не поскажет, предложи на каком-то frelancer.com.
по идее, работа будет дешевлее чем этот SFP.



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 05 января 2018 21:09
· Личное сообщение · #10

carver пишет:
а задешево бывает, или как на амазоне, 109 баксов + ship ?

например https://www.olx.ua/obyavlenie/prodam-moduli-gpon-olt-c-huawei-i-zte-IDw4dro.html

| Сообщение посчитали полезным: carver

Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 11 января 2018 13:49
· Личное сообщение · #11

На наге подсказали, что контрольная сумма подсчитывается где-то в недрах /usr/local/bin/web. На js подсчёт вызывается строчкой.
Code:
  1. xmlhttp.sendRequest("cgi/get_imgcrc" + parm, "", verifyImageResult);


Скачал IDA, открыл файл, поиском нашёл строку "cgi/get_imgcrc", точнее там таблица указателей на строки с разными cgi. Как теперь найти в каком месте кода идёт обращение к этой строке (Xrefs graph from ничего не даёт)?

Испанцы не отвечают.


8a67_11.01.2018_EXELAB.rU.tgz - web



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 11 января 2018 19:05 · Поправил: LinXP
· Личное сообщение · #12

попробуй забить на проверку...
function verifyImageResult(s) {
ret = evalJSON(s);
if (ret == 1) {
burnImage();
} else {
burnImage();
}
}


https://d.radikal.ru/d23/1801/0d/d5db06034eff.png
похоже

| Сообщение посчитали полезным: murder

Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 12 января 2018 05:48
· Личное сообщение · #13

LinXP
Отключать проверку не буду, чтобы не получить кирпич. За наводку на 00403DB0h спасибо - буду изучать. Кстати как ты вышел на этот код?

Добавлено спустя 53 минуты
Как нашёл код я понял - там массив структур в котором хранятся указатели на строки cgi и указатели на функции.

Добавлено спустя 2 часа 4 минуты
Потихоньку въезжаю в MIPS-ассемблер branch delay slot выглядит непривычно...

Похоже эта функция ничего толком не делает - она тупо выводит переменную g_CGIVerifyImageResult через printf. А так как g_CGIVerifyImageResult экспортируемая переменная, то она ведь может изменяться из другого процесса, я правильно понимаю?

Нашёл место, где обрабатывается массив строк - https://a.radikal.ru/a07/1801/f5/d2e34e3b034a.png

| Сообщение посчитали полезным: Rio

Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 15 января 2018 22:42
· Личное сообщение · #14

murder пишет:
Нашёл место, где обрабатывается массив строк - https://a.radikal.ru/a07/1801/f5/d2e34e3b034a.png

на правильном пути человек?



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 16 января 2018 06:52 · Поправил: murder
· Личное сообщение · #15

Похоже проверка проходит при загрузке файла (cgi/upload_image). Вышел на библиотеку "\usr\local\lib\libinfra.so", функция VOS_ImageVerify, которая в свою очередь обращается к функции UTIL_Crc32. Будем искать...

Добавлено спустя 4 часа 5 минут
Кто-нибудь пробовал отлаживать через quemu?

https://www.exploit-db.com/docs/english/36806-developing-mips-exploits-to-hack-routers.pdf

Может закинуть этот веб-сервер в debian и запустить для удалённой отладки? А то так в иде сложновато понять как там всё работает - там ещё и crc рассчитывается двумя разными алгоритмами.

Добавлено спустя 6 часов 35 минут
А вот тут приблизительно этим и занимаются, используюя магию chroot.



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 20 января 2018 06:40
· Личное сообщение · #16

Зря потратил время на запуск в Debian через QEMU - ничего не получилось, выдаёт input/output error.

Выяснил, что контрольная сумма CRC32 для всего файла расположена по смещению 0x68, перед расчётом контрольной суммы эти 4 байта обнуляются.

Интересная особенность: перед рассчётом CRC32 рассчитываются 2 16-битные контрольные суммы, но они не совпадают и выдаётся warning "WARNING: %s: vos_chkZteImgCrc() failed". Казалось бы при чём тут ZTE... Совпадение? Не думаю



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 января 2018 15:18
· Личное сообщение · #17

Успел?



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 25 января 2018 09:36 · Поправил: murder
· Личное сообщение · #18

Изменение заголовка ничего не даёт - нужно менять файлы в squashfs. Я не знаю чем паковать обратно - в исходной прошивке есть расхождения с файлами, которые создаёт mksquashfs. Отличается поле comp_opts (идёт сразу после заголовка squashfs), оно больше на 4 байта и вообще не соответствует исходникам mksquashfs. Подробности моих изысканий тут.

Добавлено спустя 8 минут
Ну ещё выяснилось, что оригинальное название модуля TW2362H-CDEL, на официальном сайте T&W такого нет, но есть TW2362H-CDEH.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 25 января 2018 15:31
· Личное сообщение · #19

murder
Здесь покури --> Link <--, может увидишь чего-нибудь интересного..



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 25 января 2018 16:08
· Личное сообщение · #20

sefkrd
Сейчас затык не в uImage, а в squashfs - в оригинальном файле присутствует нестандартная структура и я боюсь, что ядро не примет мою исправленную версию и просто не запустится.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 25 января 2018 21:50 · Поправил: sefkrd
· Личное сообщение · #21

Попробуй проверить: --> Link <--
Поменял только MAC адрес..
Пройдет проверку..
Еще был такой выхлоп:
Code:
  1. DECIMAL       HEXADECIMAL     DESCRIPTION
  2. --------------------------------------------------------------------------------
  3. 2833816       0x2B3D98        ASCII cpio archive (SVR4 with no CRC), file name: "op (skipped) already calibrated this CPU", file name length: "0xbrating ", file size: "0xInitramf"
  4. 2834296       0x2B3F78        Linux kernel version "3.10.12 (minchangchun@pon1.twsh.com) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #8 Thu Oct 23 12:41:41 "
  5. 2836246       0x2B4716        Copyright string: "Copyright 2013, Lantiq Deutschland GmbH"
  6. 2963888       0x2D39B0        xz compressed data
  7. 2979072       0x2D7500        Unix path: /lib/firmware/updates/3.10.12
  8. 3033382       0x2E4926        Neighborly text, "neighbor %.2x%.2x.%pM lost rename link %s to %s"
  9. 3171840       0x306600        CRC32 polynomial table, big endian
  10. 3481460       0x351F74        ASCII cpio archive (SVR4 with no CRC), file name: "dev", file name length: "0x00000004", file size: "0x00000000"
  11. 3481576       0x351FE8        ASCII cpio archive (SVR4 with no CRC), file name: "dev/console", file name length: "0x0000000C", file size: "0x00000000"
  12. 3481700       0x352064        ASCII cpio archive (SVR4 with no CRC), file name: "root", file name length: "0x00000005", file size: "0x00000000"
  13. 3481816       0x3520D8        ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"




Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 26 января 2018 13:41
· Личное сообщение · #22

sefkrd
Посмотри: по смещению 140260h в оригинальном файле видим 0С 80, а в твоём 08 80. Первый байт - это размер структуры comp_opts, в исходниках squashfs она определена как 8 байтовая, но в оригинальном файле там 12 непонятных байт. Думаю они там не спроста и если просто запаковать squashfs и прошить, то получим кирпич, который непонятно как потом восстанавливать.

По ссылке, которую я давал ранее можно скачать изменённую прошивку для испанского оператора Orange. В этой прошивке всё совпадает с оригиналом: и эта структура и размер файла. Как они это сделали?




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 26 января 2018 14:32 · Поправил: sefkrd
· Личное сообщение · #23

murder пишет:
изменить в исходниках mksquashfs структуру comp_opts, чтобы она была размером в 12 байт (уже сделано)

Собрал его, пробовал?
По смещению 140260h в собранном файле есть 0С 80 ?
Разобрав это(флаг -stat):
Code:
  1. void squashfs_stat(char *source)
  2. {
  3.          time_t mkfs_time = (time_t) sBlk.s.mkfs_time;
  4.          char *mkfs_str = ctime(&mkfs_time);
  5.  
  6. #if __BYTE_ORDER == __BIG_ENDIAN
  7.          printf("Found a valid %sSQUASHFS %d:%d superblock on %s.\n",
  8.                  sBlk.s.s_major == 4 ? "" : swap ? "little endian " :
  9.                  "big endian ", sBlk.s.s_major, sBlk.s.s_minor, source);
  10. #else
  11.          printf("Found a valid %sSQUASHFS %d:%d superblock on %s.\n",
  12.                  sBlk.s.s_major == 4 ? "" : swap ? "big endian " :
  13.                  "little endian ", sBlk.s.s_major, sBlk.s.s_minor, source);
  14. #endif
  15.  
  16.          printf("Creation or last append time %s", mkfs_str ? mkfs_str :
  17.                  "failed to get time\n");
  18.          printf("Filesystem size %.2f Kbytes (%.2f Mbytes)\n",
  19.                  sBlk.s.bytes_used / 1024.0, sBlk.s.bytes_used /
  20.                  (1024.0 * 1024.0));
  21.  
  22.          if(sBlk.s.s_major == 4) {
  23.                  printf("Compression %s\n", comp->name);
  24.  
  25.                  if(SQUASHFS_COMP_OPTS(sBlk.s.flags)) {
  26.                         char buffer[SQUASHFS_METADATA_SIZE] __attribute__ ((aligned));
  27.                         int bytes;
  28.  
  29.                         bytes = read_block(fd, sizeof(sBlk.s), NULL, 0, buffer);
  30.                         if(bytes == 0) {
  31.                               ERROR("Failed to read compressor options\n");
  32.                               return;
  33.                         }
  34.  
  35.                         compressor_display_options(comp, buffer, bytes);
  36.                  }
  37.          }

Думаю можно будет найти инфу о компрессии..



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 26 января 2018 16:19
· Личное сообщение · #24

В исходниках squashfs смотреть бесполезно, т.к. опции компрессора в файле нестандартные, распаковку делает liblzma. Инфу о компрессии можно получить только из LZMA2-блока. В описании xz как-то не понятно, буду смотреть исходники liblzma.

В принципе если бы я точно знал размер словаря и порядок фильтров я бы рискнул перепрошить.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 26 января 2018 16:44 · Поправил: sefkrd
· Личное сообщение · #25

murder пишет:
В принципе если бы я точно знал размер словаря


Code:
  1. Compression xz
  2.          Dictionary size 262144
  3.          Filters selected: armthumb

Это размер моего словаря..
Он равен
Code:
  1. blocksize: 262144 bytes

Посмотрел бинари по маске: 262144 (little endian), нашел по три совпадения..
Могу предположить, что у них словарь == блоку..
Code:
  1. 14 00 09 00 90 00 40 00
- вот это я не знаю.. (может из-за этих "лишних байт", у них 0С)



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 27 января 2018 06:07
· Личное сообщение · #26

В исходниках xz есть утилита lzmainfo - кажется то, что нужно.

Добавлено спустя 21 минуту
Не получается собрать - процесс останавливается на этом
Code:
  1. make: *** No rule to make target '../../src/liblzma/liblzma.la', needed by 'lzmainfo'.  Stop.


Добавлено спустя 32 минуты
Скачал lzmainfo.exe, при попытке подсунуть xz-поток выдаёт "Not a .lzma file". Теперь нужно как-то выдрать lzma-поток из xz.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 27 января 2018 15:47
· Личное сообщение · #27

murder
На чем собирал lzma?
Нужно собирать весь проект..



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 28 января 2018 05:42 · Поправил: murder
· Личное сообщение · #28

Кажется я начинаю сильно тупить: взял xz-поток, убрал stream-header и block-header и подаю то, что получилось на вход lzmainfo.exe. В ответ получаю "File is too small to be a .lzma file". Запускаю отладчик - fread пытается считать 13 байт с начала файла, но возвращает 4 и, конечно, выходит ошибка. Я в ступоре, размер подаваемого файла 1344 байта.

Добавлено спустя 9 минут
Короче втупую в отладчике запихал в буфер 13 байт из файла, изменил eax на 13 и получил "Not a .lzma file".

Добавлено спустя 15 минут
Понял - lzmainfo не декодирует фильтры и работает только для LZMA1
Code:
  1. lzma_filter filter = { .id = LZMA_FILTER_LZMA1 };


Добавлено спустя 4 часа 53 минуты
Вот написал простенькую прогу - она берёт первый блок из xz-потока и выдаёт фильтры и размер словаря для этого блока. Для проверки взял кусок первого xz-потока из оригинала и из перепакованного файла и скормил программе.

Вероятнее всего в оригинале используется простой LZMA2 и размер словаря 256Kb. Но это не точно, т.к. mksquashfs перебирает все фильтры из командной строки и подставляет лучший для каждого блока. Если фильтр не даёт улучшения сжатия, то он не будет использоваться.

5478_28.01.2018_EXELAB.rU.tgz - xzinfo.7z

Добавлено спустя 10 часов 24 минуты
Хорошая новость - в SFP модуле 2 имейджа, так что можно лить туда всякое говно без риска.

1) Отредактировал файлы: version, show_version, eeprom_a0_info, /etc/config/network.
2) Пропатчил mksquashfs - там увеличил размер структуры comp_opts до 12 байт и закомментировал строки
Code:
  1. if(dictionary_size == block_size && filter_count == 1)
  2.                 return NULL;

В файле xz_wrapper.c, чтобы опции записывались даже тогда, когда размер словаря равен размеру блока.
3) Запаковал
Code:
  1. /usr/local/bin/mksquashfs squashfs-root ZISA.bin -262144 -no-xattrs -nopad -comp xz -Xdict-size 262144

В оригинале файл выровнен по границе 256Кб причём в заголовке суперблока эти байты тоже учитываются да и выровнено символами 0xFF. Я не стал заморачиваться с выравниванием - оставил как есть (-nopad).
4) В hex-редакторе вставил полученный файл в прошивку, скопировал структуру comp_opts из оригинала, пересчитал CRC32 по смещению 0x68.
5) Шил через telnet имейдж b, затем активировал его
Code:
  1. System# wget b http://192.168.1.254/1.upf
  2. Connecting to 192.168.1.254 (192.168.1.254:80)
  3. tardev               100% |*******************************|  3606k  0:00:00 ETA
  4.  
  5. Start to verify software image...Succeed!
  6. Write image ................................Succeed!
  7. System# set actimage b

6) После ребута проверяю - имейдж b не валидный
Code:
  1. System# show actimage
  2. Current active image: ImageA
  3. Next active image   : ImageA
  4. System# exit
  5. T&W# omci
  6. omci# show me classname swimage
  7. omci# SwImage: 0x0000, Version:V1.0.0
  8.     Version = 0x56312E302E300000000000000000
  9.     IsCommitted = 1(0x1)
  10.     IsActive = 1(0x1)
  11.     IsValid = 1(0x1)
  12. SwImage: 0x0001, Version:
  13.     Version = 0x0000000000000000000000000000
  14.     IsCommitted = 0(0x0)
  15.     IsActive = 0(0x0)
  16.     IsValid = 0(0x0)

sefkrd
Твою прошивку тоже пробовал - она даже верификацию не проходит.

Добавлено спустя 10 часов 32 минуты
Думаю размер должен быть таким же как в оригинале байт в байт. По крайней мере у Valero&Torres это так. У меня же получается файл большего размера.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 29 января 2018 01:22
· Личное сообщение · #29

Хорошая работа!
murder пишет:
верификацию не проходит

Я с другими параметрами собирал..
А как сквош в прошивку лил, dd?



Ранг: 16.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 29 января 2018 06:19 · Поправил: murder
· Личное сообщение · #30

Не знаю, что изменилось, но сегодня линк поднялся. IP-адрес от провайдера получил без указания vlan, что странно, т.к. интернет там на vlan40. Пока всё работает как надо и перепрошивка отменяется. Не знаю надолго ли.

А как сквош в прошивку лил, dd?
Не - я к Windows привык, использую HxD, в нём же и контрольные суммы пересчитывать можно.

Добавлено спустя 10 минут
Кстати сегодня уже успел попробовать удалить пару "лишних" файлов - /www/register_banner.gif и /www/register_content.gif. После этого сквош получился приемлемого размера. Паковал без nopad. Затем выровнял по границе 256K символами 0xFF и заменил выравнивающие нули. Насчёт того, что в заголовке суперблока указывается размер с выравниванием я ошибся, так что оставил как есть. Однако после прошивки не взлетело.


 eXeL@B —› Основной форум —› Модификация прошивки OpenWRT
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати