Получение root на китайской IP камере V380

Приобрёл IP камеру V380E, плата MVR3313S-A4-V3.8. Подключиться через telnet не удалось, т.к. пароль на рута найти не вышло. Распаял UART и подключился к консоли

screen /dev/ttyUSB0 115200


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

Считал дамп из SPI flash программатором на CH341

341spi -r V380E.bin
Команды для flashrom:
flashrom -p ch341a_spi -r V380E.bin

Далее отделил образ squashfs

dd if=V380E.bin of=V380E-A.bin bs=1 count=1966080 skip=2490368

Распаковал ФС

unsquashfs V380E-A.bin

Сгенерированный хэш пароля сохранил в etc/shadow

mkpasswd -m sha-512 -S 12345678 -s <<< 1

Получится

root:$6$12345678$U6Yv5E1lWn6mEESzKen42o6rbEmFNLlq6Ik9X3reMXY3doKEuxrcDohKUx0Oxf44aeTIxGEjssvtT1aKyZHjs.:10933:0:99999:7:::
bin:*:10933:0:99999:7:::
daemon:*:10933:0:99999:7:::
nobody:*:10933:0:99999:7:::

Упаковал обратно в squashfs образ

cd squashfs-root
mksquashfs . ../V380E-A.squashfs -comp xz -progress -Xbcj armthumb

Если указать иную архитектуру, будет ошибка

SQUASHFS error: Filesystem uses "unknown" compression. This is not supported
No filesystem could mount root, tried:  squashfs

Затем нужно переписать в дампе памяти образ

cd ..
dd status=progress if=V380E-A.squashfs of=V380E.bin seek=2490368 bs=1 conv=notrunc

И залить обратно в память, предварительно стерев на всякий случай память, а после прошивки проверить содержимое

341spi -e
341spi -w V380E.bin
341spi -r V380E.tmp
diff V380E.tmp V380E.bin
Команды для flashrom:
flashrom -p ch341a_spi -E
flashrom -p ch341a_spi -w V380E.bin
flashrom -p ch341a_spi -v V380E.bin

После загрузки можно войти в систему и удалить или заменить противные звуки, которые находятся в /mnt/mtd/mvsound, доступной для записи.

Слитый дамп до смены пароля.

Дамп с паролем «1» и удалёнными звуками.

 

Linux GPIO Interrupt Python on Orange Pi zero

Скрипт работает через прерывания от inotify. Проверялся на GPIO10.

import inotify.adapters
import inotify.constants
from threading import Thread
status=" "
def gpio():
  global status
  gpio_export  = open('/sys/class/gpio/export', 'w')
  gpio_export.write('10')
  #gpio_export.close()
  gpio_edge  = open('/sys/class/gpio/gpio10/edge', 'w')
  gpio_edge.write('both')                              #both - любое изменение, rising - по высокому уровню, falling - низкий уровень, none - отключено
  #gpio_edge.close()

  i = inotify.adapters.Inotify()
  i.add_watch(b'/sys/class/gpio/gpio10/value', mask=inotify.constants.IN_MODIFY)
  while True:
    for event in i.event_gen():
      if event is not None:
        
        gpio_r = open('/sys/class/gpio/gpio10/value', 'r')
        status=gpio_r.read(1)
        #print(status)  

def main():
  global status
  statusold=" "
  while True:
    if status != statusold:
      print(status)

Светодиодная лампа с BLE модулем JDY-08

Подключение к лампе модуля JDY-08 с питанием от бестрансформаторного источника питания.
Читать далее Светодиодная лампа с BLE модулем JDY-08

Драйвер светодиодного фонаря на SX1308 (MT3608)

Купил как-то в одном магазине со всяким хламом по одной цене фонарь примерно за 50р.

Всё в нём довольно хорошо, кроме одного: на боковые светодиоды нет даже резистора для ограничения тока. Когда батарейки немного сядут, светодиоды светят тускло, а то и вовсе перестают светиться.
Читать далее Драйвер светодиодного фонаря на SX1308 (MT3608)

ATTINY13 ADC-UART

Трёхканальный АЦП выполнен на микроконтроллере ATTINY13 и передаёт данные один раз в секунду через программный UART на скорости 9600 бод. Данные приходят в шестнадцатиричном виде, каждый канал разделяется пробелом, после чего следует конец строки \r\n.

Читать далее ATTINY13 ADC-UART

Тестер датчиков температуры DS1820, DS18S20 и DS18B20


Устройство предназначено для проверки датчиков температуры DS1820, DS18S20 и DS18B20, читая из одного датчика адрес и температуру. Собрано на ATMEGA8535 (Частота 8МГц) и дисплее на совместимом с HD44780 контроллере, 1602 с aliexpress без кириллицы. Читать далее Тестер датчиков температуры DS1820, DS18S20 и DS18B20