Beste mede-tweakers,
Ik probeer de firmware van een D-LINK DCS-1130 camera te emuleren d.m.v QEMU onder Ubuntu 18.0.4 maar ik loop helaas tegen een probleem aan waar ik niet mee verder kom
... Hopelijk heeft iemand van jullie de gouden tip .... 
(In ieder geval bedankt voor de moeite voor het lezen van dit topic
)
Setup
Firmware
ftp://ftp.dlink.ca/PRODUC...CS-1130_FIRMWARE_1.04.ZIP
Het probleem
Het volgende gebeurd wanneer ik busybox probeer uit te voeren met chroot op mijn Debian/SID image onder QEMU:
Nu is het natuurlijk voor de hand liggend dat de executable is gecompileerd voor een andere architectuur dan mijn guest OS (ARMV7). Echter gebeurd het volgende wanneer ik hetzelfde commando uitvoer op mijn Docker image (tevens ARMV7):
Volgens file en readelf betreft het hier een 32-bit ARM executable in little endian byte order. De binary is gestript dus het is niet mogelijk om architecture specifieke kenmerken vast te stellen met readelf.
Als ik de output van lscpu vergelijk van mijn Debian guest met mijn Docker image dan hebben we beide een armv7l 32 bit little endian kernel:
lscpu (QEMU/Debian)
lscpu (Docker/Ubuntu)
Dus mijn vraag is eigenlijk ... waarom wordt de executable wel uitgevoerd onder de Docker/Ubuntu image en niet onder QEMU/Debian? De reden dat ik niet gewoon gebruik maak van de Docker image is omdat in de versie van QEMU, waarvan Docker onderliggend gebruik maakt, geen ptrace functionaliteit is geïmplementeerd waardoor het gebruik van GDB niet triviaal is.
Ik heb natuurlijk geprobeerd de instructie op te sporen die de fout geeft maar helaas wil dat niet lukken met GDB. Ook niet na het kopiëren van de libraries naar /lib en /usr/lib waarna in de executable naar verwezen wordt:
Iemand een idee ...
? Ik vermoed dat mijn Debian image een instructieset mist die wel aanwezig is op mijn Docker image ... maar hoe kom ik er achter welke dat is ?
Ik probeer de firmware van een D-LINK DCS-1130 camera te emuleren d.m.v QEMU onder Ubuntu 18.0.4 maar ik loop helaas tegen een probleem aan waar ik niet mee verder kom

(In ieder geval bedankt voor de moeite voor het lezen van dit topic
Setup
Host | |
Distributie: | Ubuntu 18.0.4 LTS |
Kernel: | Linux ubuntu 5.0.0-27-generic #28~18.04.1-Ubuntu SMP Thu Aug 22 03:00:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux |
Guest (QEMU) | |
Distributie: | Debian SID |
Kernel: | Linux debian-arm 5.2.0-2-armmp-lpae #1 SMP Debian 5.2.9-2 (2019-08-21) armv7l GNU/Linux |
Startup parameters | sudo qemu-system-arm -M virt -m 512 \ -bios bios/QEMU_EFI.fd \ -kernel kernel/vmlinuz-5.2.0-2-armmp-lpae \ -initrd kernel/initrd.img-5.2.0-2-armmp-lpae \ -hda hdd/hda.qcow2 -append "root=/dev/debian-arm-vg/root" \ -netdev tap,id=mynet \ -device virtio-net-device,netdev=mynet \ -nographic |
Guest (Docker) | Note: Test image |
Distributie: | Ubuntu 18.0.4 |
Image: | https://hub.docker.com/r/arm32v7/ubuntu/ |
Kernel: | Linux b6364eb9fa9d 4.14.131-linuxkit #1 SMP Fri Jul 19 12:31:17 UTC 2019 armv7l armv7l armv7l GNU/Linux |
Firmware
ftp://ftp.dlink.ca/PRODUC...CS-1130_FIRMWARE_1.04.ZIP
Het probleem
Het volgende gebeurd wanneer ik busybox probeer uit te voeren met chroot op mijn Debian/SID image onder QEMU:
code:
1
2
3
| user@debian-arm:~/Firmware/DCS-1130$ sudo chroot cramfs-root /bin/busybox Illegal instruction user@debian-arm:~/Firmware/DCS-1130$ |
Nu is het natuurlijk voor de hand liggend dat de executable is gecompileerd voor een andere architectuur dan mijn guest OS (ARMV7). Echter gebeurd het volgende wanneer ik hetzelfde commando uitvoer op mijn Docker image (tevens ARMV7):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| root@b6364eb9fa9d:/firmware/_DCS-1130_FIRMWARE_1.04.BIN-1.extracted# chroot cramfs-root /bin/busybox BusyBox v1.01 (2013.04.12-11:24+0000) multi-call binary Usage: busybox [function] [arguments]... or: [function] [arguments]... BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as! Currently defined functions: [, addr, arping, ash, awk, basename, busybox, cat, chgrp, chmod, chown, chroot, clear, cp, cpuload, cut, date, dd, df, dirname, dmesg, du, echo, egrep, env, expr, false, find, free, getopt, getty, grep, halt, head, hexdump, hostname, hwclock, id, ifconfig, ifdown, ifup, init, insmod, install, kill, killall, klogd, linuxrc, ln, login, logread, ls, lsmod, md5sum, mesg, mkdir, mkfifo, mknod, mktemp, modprobe, more, mount, mv, netstat, nslookup, pidof, ping, pivot_root, poweroff, ps, pwd, read1, read2, read4, reboot, reset, rm, rmdir, rmmod, route, run-parts, sed, sh, sleep, start-stop-daemon, stty, sync, syslogd, tail, tar, telnetd, test, tftp, time, top, touch, true, tty, udhcpc, umount, uname, uniq, uptime, usleep, vi, wc, which, whoami, write1, write2, write4, yes, zcip |
Volgens file en readelf betreft het hier een 32-bit ARM executable in little endian byte order. De binary is gestript dus het is niet mogelijk om architecture specifieke kenmerken vast te stellen met readelf.
code:
1
| busybox: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked, interpreter /lib/ld-, stripped |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ELF Header: Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: ARM ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0xc9d4 Start of program headers: 52 (bytes into file) Start of section headers: 397416 (bytes into file) Flags: 0x202, GNU EABI, software FP, <unknown> Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 5 Size of section headers: 40 (bytes) Number of section headers: 21 Section header string table index: 20 |
Als ik de output van lscpu vergelijk van mijn Debian guest met mijn Docker image dan hebben we beide een armv7l 32 bit little endian kernel:
lscpu (QEMU/Debian)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Architecture: armv7l Byte Order: Little Endian CPU(s): 1 On-line CPU(s) list: 0 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 1 Vendor ID: ARM Model: 1 Model name: Cortex-A15 Stepping: r2p1 BogoMIPS: 125.00 Flags: half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae e vtstrm |
lscpu (Docker/Ubuntu)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Architecture: armv7l CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 4 Vendor ID: GenuineIntel CPU family: 6 Model: 70 Model name: Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz Stepping: 1 CPU MHz: 2791.459 BogoMIPS: 5582.91 L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 6144K L4 cache: 131072K Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht pbe syscall nx pdpe1gb lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq dtes64 ds_cpl ssse3 sdbg fma cx16 xtpr pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm pti fsgsbase bmi1 avx2 bmi2 erms xsaveopt arat |
Dus mijn vraag is eigenlijk ... waarom wordt de executable wel uitgevoerd onder de Docker/Ubuntu image en niet onder QEMU/Debian? De reden dat ik niet gewoon gebruik maak van de Docker image is omdat in de versie van QEMU, waarvan Docker onderliggend gebruik maakt, geen ptrace functionaliteit is geïmplementeerd waardoor het gebruik van GDB niet triviaal is.
Ik heb natuurlijk geprobeerd de instructie op te sporen die de fout geeft maar helaas wil dat niet lukken met GDB. Ook niet na het kopiëren van de libraries naar /lib en /usr/lib waarna in de executable naar verwezen wordt:
code:
1
2
3
| Starting program: /home/user/Firmware/DCS-1130/cramfs-root/bin/busybox /bin/bash: /home/user/Firmware/DCS-1130/cramfs-root/bin/busybox: No such file or directory During startup program exited with code 127. |
Iemand een idee ...
