Close

UBoot experiments

A project log for Reverse Engineering a ProMark VR Toy Drone

Notes from hacking around with a $100USD WiFi enabled QuadCopter.

dan-julioDan Julio 01/10/2017 at 05:520 Comments

ProMark helpfully left a second's worth of delay in UBoot before staring the boot process available on the serial port. This meant I could get a UBoot prompt and output the machine's environment variables which show some interesting information (the output of "printenv" shown at the end of this post). It also meant I could try to boot into a single-user prompt which I was ultimately able too after a bunch of experimenting and a friend's helpful suggestion to watch some master's manipulation of UBoot on youtube. The trick for this device is to set "flashargs" as shown below to boot into /bin/sh.

setenv flashargs ‘run commonargs; set bootargs ${bootargs} root=${flashroot} rootfstype=${flashrootfstype} noinitrd init=/bin/sh’

boot



I also changed the boot delay to 3 seconds to make it easier to interrupt the boot process (which is simply sending some character via the console serial port). "saveenv" writes the changes permanently to the flash memory (as opposed to the change I made above to flashargs which does not persevere over a power-cycle).

setenv bootdelay 3
saveenv

The system uses busybox to provide most functions including "cat". I took a look at /etc/passwd from the single-user prompt and was disappointed. The system allows no logins, whatsoever, even though it allows a telnet connection and provides a login on the serial port. Score one for the security conscious developers at ProMark. Here's the contents of the /etc/passwd file from the single-user prompt (all the way from setting the UBoot environment variable "flashargs" through the boot and cat of /etc/passwd):

ipcam # setenv flashargs 'run commonargs; set bootargs ${bootargs} root=${flashroot} rootfstype=${flashrootfstype} noinitrd init=/bin/sh'

ipcam # printenv flashargs

flashargs=run commonargs; set bootargs ${bootargs} root=${flashroot} rootfstype=${flashrootfstype} noinitrd init=/bin/sh

ipcam # boot

Booting from SPI Flash...

8192 KiB hi_sfc at 0:0 is now current device

## Booting kernel from Legacy Image at 81000000 ...

   Image Name:   Linux-3.0.8

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1723048 Bytes = 1.6 MiB

   Load Address: 80008000

   Entry Point:  80008000

   Loading Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 3.0.8 (root@hiber) (gcc version 5.2.0 (Buildroot 2015.11.1) ) #4 Thu Aug 25 05:42:37 EDT 2016

CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177

CPU: VIVT data cache, VIVT instruction cache

Machine: hi3518

Memory policy: ECC disabled, Data cache writeback

AXI bus clock 200000000.

Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 10160

Kernel command line: mem=40M mmz=24M console=ttyAMA0,115200n8 mtdparts=hi_sfc:512k(uboot)ro,256k(uboot-env),256k(mfd),3m(kernel),4m(rootfs) hieth.mdioifu=1 hieth.mdioifd=1 hieth.phyaddru=0 hieth.phyaddrd=1 root=/dev/mtdblock4 rootfstype=squashfs,jffs2 noinitrd init=/bin/sh

PID hash table entries: 256 (order: -2, 1024 bytes)

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)

Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)

Memory: 40MB = 40MB total

Memory: 35852k/35852k available, 5108k reserved, 0K highmem

Virtual kernel memory layout:

    vector  : 0xffff0000 - 0xffff1000   (   4 kB)

    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)

    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)

    vmalloc : 0xc3000000 - 0xfe000000   ( 944 MB)

    lowmem  : 0xc0000000 - 0xc2800000   (  40 MB)

    modules : 0xbf000000 - 0xc0000000   (  16 MB)

      .init : 0xc0008000 - 0xc0027000   ( 124 kB)

      .text : 0xc0027000 - 0xc044b000   (4240 kB)

      .data : 0xc044c000 - 0xc047d740   ( 198 kB)

       .bss : 0xc047d764 - 0xc0496d70   ( 102 kB)

SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1

NR_IRQS:128 nr_irqs:128 128

sched_clock: 32 bits at 100MHz, resolution 10ns, wraps every 42949ms

Calibrating delay loop... 218.72 BogoMIPS (lpj=1093632)

pid_max: default: 32768 minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

devtmpfs: initialized

NET: Registered protocol family 16

Serial: AMBA PL011 UART driver

uart:0: ttyAMA0 at MMIO 0x20080000 (irq = 5) is a PL011 rev2

console [ttyAMA0] enabled

uart:1: ttyAMA1 at MMIO 0x20090000 (irq = 5) is a PL011 rev2

bio: create slab  at 0

SCSI subsystem initialized

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

cfg80211: Calling CRDA to update world regulatory domain

Switching to clocksource timer1

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 2048 (order: 2, 16384 bytes)

TCP bind hash table entries: 2048 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2048 bind 2048)

TCP reno registered

UDP hash table entries: 256 (order: 0, 4096 bytes)

UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)

NET: Registered protocol family 1

RPC: Registered named UNIX socket transport module.

RPC: Registered udp transport module.

RPC: Registered tcp transport module.

RPC: Registered tcp NFSv4.1 backchannel transport module.

squashfs: version 4.0 (2009/01/31) Phillip Lougher

JFFS2 version 2.2. (NAND) .. 2001-2006 Red Hat, Inc.

fuse init (API version 7.16)

msgmni has been set to 70

Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)

io scheduler noop registered

io scheduler deadline registered (default)

io scheduler cfq registered

brd: module loaded

Spi id table Version 1.22

Spi(cs1) ID: 0xEF 0x40 0x17 0x00 0x00 0x00

SPI FLASH start_up_mode is 3 Bytes

Spi(cs1): 

Block:64KB 

Chip:8MB 

Name:"W25Q64FV"

spi size: 8MB

chip num: 1

5 cmdlinepart partitions found on MTD device hi_sfc

Creating 5 MTD partitions on "hi_sfc":

0x000000000000-0x000000080000 : "uboot"

0x000000080000-0x0000000c0000 : "uboot-env"

0x0000000c0000-0x000000100000 : "mfd"

0x000000100000-0x000000400000 : "kernel"

0x000000400000-0x000000800000 : "rootfs"

Fixed MDIO Bus: probed

himii: probed

RTL871X: module init start

RTL871X: rtl8188eu v4.3.24_16705.20160509

RTL871X: build time: Aug 25 2016 05:41:55

usbcore: registered new interface driver rtl8188eu

RTL871X: module init ret=0

usbmon: debugfs is not available

ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver

hiusb-ehci hiusb-ehci.0: HIUSB EHCI

hiusb-ehci hiusb-ehci.0: new USB bus registered, assigned bus number 1

hiusb-ehci hiusb-ehci.0: irq 15, io mem 0x100b0000

hiusb-ehci hiusb-ehci.0: USB 0.0 started, EHCI 1.00

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 1 port detected

ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

hiusb-ohci hiusb-ohci.0: HIUSB OHCI

hiusb-ohci hiusb-ohci.0: new USB bus registered, assigned bus number 2

hiusb-ohci hiusb-ohci.0: irq 16, io mem 0x100a0000

hub 2-0:1.0: USB hub found

hub 2-0:1.0: 1 port detected

sp805-wdt dev:wdog: registration successful

TCP cubic registered

NET: Registered protocol family 10

IPv6 over IPv4 tunneling driver

NET: Registered protocol family 17

registered taskstats version 1

.VFS: Mounted root (squashfs filesystem) readonly on device 31:4.

devtmpfs: mounted

Freeing init memory: 124K

usb 1-1: new high speed USB device number 2 using hiusb-ehci

/bin/sh: can't access tty; job control turned off

/ # bFWReady == _FALSE call reset 8051...

RTL871X: hal_com_config_channel_plan chplan:0x08

RTL871X: rtw_ndev_init(wlan0) if1 mac_addr=00:0a:e2:1f:49:59

/ #

/ # cat /etc/passwd

root:x:0:0:root:/root:/bin/sh

daemon:x:1:1:daemon:/usr/sbin:/bin/false

bin:x:2:2:bin:/bin:/bin/false

sys:x:3:3:sys:/dev:/bin/false

sync:x:4:100:sync:/bin:/bin/sync

mail:x:8:8:mail:/var/spool/mail:/bin/false

www-data:x:33:33:www-data:/var/www:/bin/false

operator:x:37:37:Operator:/var:/bin/false

nobody:x:99:99:nobody:/home:/bin/false

dbus:x:1000:1000:DBus messagebus user:/var/run/dbus:/bin/false

/ # 


The system filesystem is booted into a Read-only state so modifying files during runtime is not possible. This means that we have to either modify them on the SPI flash chip (the HI3518 boots from an 8-pin SPI flash chip) or upload a modified firmware update (which, sadly, ProMark seems to have none of...). Since I don't have access to Wifi (yet?) from single-user prompt then right now the only possibility seems to be to offload the SPI chip and then modify the data before reprogramming it (a chore...). Perhaps later or sooner if some expert gives me some advice...

Output of UBoot "printenv":

ipcam # printenv

bootargs=mem=40M console=ttyAMA0,115200

bootcmd=run autoboot

bootdelay=1

baudrate=115200

ethaddr=00:00:23:34:45:66

ipaddr=192.168.1.10

serverip=192.168.1.2

preboot=mw 200f000c 0; mw 20150400 10; mw 20150040 10

rootpath=/tftpboot/hi3518/rootfs

gatewayip=192.168.1.1

netmask=255.255.255.0

bootfile=hi3518/uImage

loadaddr=0x81000000

mdio_intf=rmii

phyaddru=0

phyaddrd=1

meminfo=mem=40M

mmzinfo=mmz=24M

console=ttyAMA0,115200n8

netdev=eth0

nfsopts=hard,tcp,vers=3

hieth=hieth.mdioifu=1 hieth.mdioifd=1 hieth.phyaddru=0 hieth.phyaddrd=1

flashroot=/dev/mtdblock4

flashrootfstype=squashfs,jffs2

mtdparts=hi_sfc:512k(uboot)ro,256k(uboot-env),256k(mfd),3m(kernel),4m(rootfs)

commonargs=setenv bootargs ${meminfo} ${mmzinfo} console=${console} mtdparts=${mtdparts} ${hieth} 

flashargs=run commonargs; set bootargs ${bootargs} root=${flashroot} rootfstype=${flashrootfstype}

flashboot=echo Booting from SPI Flash...; run flashargs; sf probe 0 && sf read ${loadaddr} 0x100000 0x300000 && bootm

nfsargs=run commonargs; setenv bootargs ${bootargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},${nfsopts}

addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off

nfsboot=run nfsargs; run addip; tftp ${loadaddr} ${bootfile} && bootm ${loadaddr}

serialboot=echo Booting from serial (Y-MODEM)...; run commonargs; loady && bootm

autoboot=if run flashboot; then; else run serialboot; fi

sensor_type=gc1014

hwmode=g

mLwFlg=0

wifi_channel=2

ssid=P70-VR

Mirror=1

stdin=serial

stdout=serial

stderr=serial

verify=n

ver=U-Boot 2010.06 (Jul 26 2016 - 01:40:47)

Environment size: 1587/65531 bytes

ipcam # 

Discussions