понедельник, 13 января 2014 г.

TP-Link TL-WR1043ND. Подготовка диверсионной группы.

В предыдущей части мы собрали кросс-тулчейн для того, чтобы внедрить парочку полезных вещиц в наш роутер. Теперь настало время этим заняться.
Для начала хочу сообщить, что без плясок с libtool и, возможно, чем-нибудь еще простого указания --target=<arch-triplet> недостаточно. Советую обратиться к INSTALL каждой утилиты, которую вы будете собирать, и приведу пример сборки с ранее рассмотренным тулчейном легковесного SSH-сервера dropbear:
./configure --host=$TARGET CC=${TARGET}-gcc CFLAGS="$CFLAGS -L${PREFIX} -I${PREFIX}/usr/include" LDFLAGS="$LDFLAGS -L${PREFIX}" && make && make install
Лично в моем случае еще пришлось отказаться от использования zlib, используя соответствующий ключик. Также в ряде случаев может помочь указание флага -std=gnu99 в CFLAGS.
После того, как все собралось, я столкнулся со следующей проблемой - динамически слинкованный бинарник отказывался запускаться на роутере:
dropbear: not found
Танцы с бубном вокруг гугла не помогли, пришлось включать мозг и искать проблему самостоятельно. Так вот, в составе binutils есть замечательная утилита - readelf. При ее применении к "родному" busybox получаем такой результат:
$ /opt/mips/bin/mips-linux-readelf -l busybox

Elf file type is EXEC (Executable file)
Entry point 0x405360
There are 7 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00400034 0x00400034 0x000e0 0x000e0 R E 0x4
INTERP 0x000114 0x00400114 0x00400114 0x00014 0x00014 R 0x1
[Requesting program interpreter: /lib/ld-uClibc.so.0]
REGINFO 0x000128 0x00400128 0x00400128 0x00018 0x00018 R 0x4
LOAD 0x000000 0x00400000 0x00400000 0x3ed54 0x3ed54 R E 0x1000
LOAD 0x03f000 0x10000000 0x10000000 0x02040 0x0829c RW 0x1000
DYNAMIC 0x000140 0x00400140 0x00400140 0x04d1f 0x04d1f RWE 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .reginfo
03 .interp .reginfo .dynamic .hash .dynsym .dynstr .gnu.version .gnu.version_r .init .text .MIPS.stubs .fini .rodata .eh_frame
04 .ctors .dtors .jcr .data.rel.ro .data .rld_map .got .sbss .bss
05 .dynamic .hash .dynsym .dynstr
06

а при применении к свежесобранному dropbear - такой результат:
$ /opt/mips/bin/mips-linux-readelf -l dropbear

Elf file type is EXEC (Executable file)
Entry point 0x404230
There are 8 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00400034 0x00400034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x00400134 0x00400134 0x0000d 0x0000d R 0x1
[Requesting program interpreter: /lib/ld.so.1]
REGINFO 0x000144 0x00400144 0x00400144 0x00018 0x00018 R 0x4
LOAD 0x000000 0x00400000 0x00400000 0x44094 0x44094 R E 0x10000
LOAD 0x044094 0x00484094 0x00484094 0x00e20 0x01338 RW 0x10000
DYNAMIC 0x00015c 0x0040015c 0x0040015c 0x04046 0x04046 RWE 0x4
GNU_EH_FRAME 0x044080 0x00444080 0x00444080 0x00014 0x00014 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .reginfo
03 .interp .reginfo .dynamic .hash .dynsym .dynstr .init .text .MIPS.stubs .fini .rodata .eh_frame_hdr
04 .eh_frame .ctors .dtors .jcr .data.rel.ro .data .rld_map .got .bss
05 .dynamic .hash .dynsym .dynstr
06 .eh_frame_hdr
07
Давайте взглянем на оба вывода подробнее. Нас интересуют строки:
[Requesting program interpreter: /lib/ld-uClibc.so.0]
[Requesting program interpreter: /lib/ld.so.1]
При этом собирались оба бинарника с одной и той же версией uClibc. Конечно, по-хорошему надо было бы выяснить, почему при линковке ld указывает именно такой путь к лоадеру, но есть вариант проще - сделать символическую ссылку с именем ld.so.1 на ld-uClibc.so.0. Результат закономерный - dropbear запускается, хотя ничего и не говорит и в ps не отображается. Но это уже не проблема тулчейна, а проблема установки, инструкцию к которой я не удосужился прочесть (интересно, как без создания RSA-ключа будет работать SSH-сервер?)

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

Комментариев нет:

Отправить комментарий