Не­ред­ко при соз­дании кас­томных про­шивок для роуте­ра воз­ника­ет необ­ходимость в под­делке под­писи, что­бы мож­но было гру­зить про­шив­ку через сто­ковую веб‑мор­ду. А для под­делки под­писи нам понадо­бит­ся изу­чить про­цесс про­вер­ки обра­за в сто­ковой про­шив­ке. Пред­лагаю оку­нуть­ся в реверс про­шив­ки на при­мере роуте­ра D-Link DIR-806A B1. Давай раз­берем­ся, как в нем работа­ет про­вер­ка под­писи.

У это­го роуте­ра 8 Мбайт флеш‑памяти и 64 Мбайт — опе­ратив­ной. Работа­ет он на чипе MediaTek MT7620A. Этот камень осно­ван на архи­тек­туре MIPS и под­держи­вает­ся ядром Linux. Заг­рузка сто­ковой про­шив­ки про­исхо­дит через U-Boot. Там есть встро­енный TFTP-кли­ент для вос­ста­нов­ления в слу­чае, если залил неудач­ную про­шив­ку. Глав­ное — не убить бут­лоадер, ина­че при­дет­ся паять.

На мой взгляд, отличная желез­ка для экспе­римен­тов. Один из минусов — у DIR-806A в ори­гиналь­ной ком­плек­тации нет USB. Одна­ко трас­сиров­ка USB при­сутс­тву­ет на пла­те, так что при дол­жном уров­не зна­ний и сно­ров­ки порт мож­но рас­паять самос­тоятель­но.

Мы же нач­нем с под­клю­чения к UART, так что не забудь запас­тись пре­обра­зова­телем уров­ней для UART. При под­клю­чении нуж­но не забыть «пок­рестить» RX и TX. То есть RX-линию под­клю­чаем к TX, а TX — к RX. Парамет­ры соеди­нения — 57600 8N1.

Распиновка UART
Рас­пинов­ка UART

Итак, под­клю­чились к UART. Поп­робу­ем про­шить паци­ента, одновре­мен­но пог­лядывая в кон­соль. Вдруг там есть какие‑то стро­ки, которые помогут нам най­ти учас­тки кода, отве­чающие за про­цесс про­шив­ки?

signallin(6) start... mtd: "Linux"
libmtd (_mtd_write_ex): to "/dev/mtd6", size: 0x6c4764, offset: 0x0, buffer: 0x2afa6000

Уда­ча! Роутер пишет в кон­соль сооб­щение о начале обновле­ния и ука­зыва­ет раз­дел, на который льет­ся про­шив­ка. При ревер­се будем искать стро­ки, а по стро­кам — мес­то в коде. Клас­сика! Поп­робу­ем поис­кать стро­ку start... в про­шив­ке:

# grep -nr "start..." /sbin
/sbin/fw_updater:12411:(%d) start... mtd: "%s"

Мы наш­ли ути­литу fw_updater. Поп­робу­ем ее запус­тить:

fw_updater

(6) usage: fwupdater

По­хоже, имен­но она накаты­вает новую про­шив­ку в раз­дел Linux.

info

Ес­ли бы никако­го тек­ста не было, приш­лось бы ревер­сить саму веб‑мор­ду. Там обя­затель­но есть сооб­щения, коды оши­бок и про­чее, что потом мож­но поис­кать. Отту­да же мож­но вый­ти на ути­литы про­шив­ки. Либо науда­чу поис­кать ути­литы, в наз­вани­ях которых будут сло­ва fw, firmware, update и всё в этом духе. Еще мож­но искать в про­шив­ке стро­ки CRC, image и про­чее.

Те­перь поп­робу­ем най­ти, отку­да fw_updater вызыва­ется в про­шив­ке:

grep -nr "fw_updater" /lib

/lib/libdhal.so:88250:/sbin/fw_updater
/lib/libdhal.so:88254:/tmp/fw_updater

Мы обна­ружи­ли, что fw_updater исполь­зует­ся в биб­лиоте­ке libdhal.so. Это очень любопыт­но. Поп­робу­ем взгля­нуть, что у нее внут­ри. Для ревер­са будем исполь­зовать Ghidra. Она поз­воля­ет пре­обра­зовать бинар­ный исполня­емый файл в код на С. Это очень удоб­но, и не при­дет­ся копать­ся в ассем­блер­ном лис­тинге.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии