
Hardware-Hacking-Spickzettel
[[TOC]]
250-350 CVCC und GND gut zugänglich hat, ist sehr nützlichGND, oder , oder und TODO SPI-DUMP
TODO GDB ANHÄNGEN????
/etc/rc/etc/rc.local/etc/rc.conf für Informationen/etc/rc.d/ aus/etc/inittab
runlevel
1: Einzelbenutzermodus, Root-Shell, kein Passwort, kein Daemon läuft3: textbasierter Mehrbenutzermodus, Login-Prompt5: grafischer Login/etc/init.d/ aus/sbin/init analysieren, um nach obigen Informationen zu suchen, die den Typ identifizierenfile-BefehlQEMU-Ausführungsformat finden: qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipselWenn die Prozessorfamilie bekannt ist, kann sie angegeben werden, um QEMU eine bessere Emulation zu ermöglichen
$QEMUBIN -cpu helpWir benötigen Kernel und Root-Dateisystem
Kernel-Version, libc-Version und Liste der vom interessierenden ausführbaren Programm verwendeten Bibliotheken finden (readelf -d $EXECUTABLE)
INRXOUTTXVCC3/4 Pins auf der Platine
GND
GNDVCC
VCCGND (Multimeter auf Widerstandsmessung, normalerweise 200k)VCC (Multimeter auf Widerstandsmessung, normalerweise 200kOhm)GND (Multimeter auf Spannungsmessung, normalerweise 20V)TX-UART-Pin-Spannung gegen GND (Multimeter auf Spannungsmessung, normalerweise 20V); wenn die Spannung oszilliert, ist dieser Pin wahrscheinlich TX (weil er Daten sendet)RX-UART-Pin-Spannung gegen GND (Multimeter auf Spannungsmessung, normalerweise 20V); wenn die Spannung bei 0 bleibt, ist dieser Pin wahrscheinlich RX (weil er auf den Empfang von Daten wartet)Tabelle
115200)H ist die Hilfe-Funktion, verwende sie überallGND mit Jtagulator GND, Board-Pins 1,2,3 mit Jtagulator-Kanälen 1,2,3V: Stelle Betriebsspannung einU: Rufe das UART-Identifikationsmenü aufU: Starte IdentifikationText string to output: StandardStarting channel: Kanal, auf dem wir den Pin 1 des Boards platziert habenEnding channel: Kanal, auf dem wir den Pin 3 des Boards platziert habenIgnore non-printable characters: Ja3.3V oder 5V), sonst werden das Board oder der serielle Adapter beschädigtRX mit Adapter TX und Board TX mit Adapter RX
VCC-Pins nicht erforderlichsudo lsusb um den Adapter zu findenls -lart /dev um alle Gerätedateien zu finden; unsere sollte eine der letzten sein, normalerweise ttyUSB0dialout-Gruppe sein (oder root), um unsere Gruppen zu überprüfen: groups $USERscreen /dev/ttyUSB0 $BAUDRATE um sich mit dem TTY zu verbinden
$BAUDRATE kann einer der hier gefundenen sein$BAUDRATE
1152009600576003840019200$BAUDRATE vermasseln, sehen wir möglicherweise Kauderwelsch oder auch GAR NICHTSctrl + a -> k -> y: Bildschirm schließen\r\n oder \n?
pyserial, die Python-Bibliothek für serielle Kommunikation, Beispiel:
#!/usr/bin/env python3
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
ser.write(b"HELLO\r\n")
ser.write(b"HELLO\n")
0 oder 1TCK, TDI, TDO, TMS und TRST (optional)
TCK (Test Clock): Der Taktgeber oder Metronom, das die Geschwindigkeit des Controllers vorgibt. Die Spannung auf diesem Pin pulsiert einfach in einem rhythmischen, gleichmäßigen Takt auf und ab. Bei jedem "Takt" des Controllers führt dieser eine einzelne Aktion aus.TMS (Test Mode Select): Spannungen auf dem Mode-Select-Pin steuern, welche Aktion JTAG ausführt. Durch Manipulation der Spannung auf diesem Pin sagst du JTAG, was es tun soll.TDI (Test Data-In): Der Pin, der Daten in den Chip einspeist. Der JTAG-Standard definiert keine Protokolle für die Kommunikation über diesen Pin. Das bleibt dem Hersteller überlassen. JTAG betrachtet diesen Pin lediglich als Eintrittsmethode für 1en und 0en in den Chip. Was der Chip damit macht, ist für JTAG irrelevant.TDO (Test Data-Out): Der Pin für Daten, die den Chip verlassen. Wie beim Data-In-Pin sind Kommunikationsprotokolle nicht durch JTAG definiert.TRST (Test Reset, optional): Dieses Signal wird verwendet, um JTAG in einen bekannten guten Zustand zurückzusetzen.5/6 Pins oder einer doppelten Reihe von 10, 12, 14, 20 Pins auf der Platine
GND
GNDVCC
VCCGND (Multimeter auf Widerstandsmessung, normalerweise 200k)VCC (Multimeter auf Widerstandsmessung, normalerweise )115200)H ist die Druckhilfefunktion, überall verwendenGND mit Jtagulator GND verbinden, Board-Pins 1,2,3... mit Jtagulator-Kanälen 1,2,3...V: Betriebsspannung einstellenJ: JTAG-Identifikationsmenü aufrufenI: Identifikation mit IDCODE-Scan, findet TDI nicht (schnell), besser bei vielen zu identifizierenden PinsB: Identifikation mit BYPASS-Scan, findet TDI (langsam), besser bei wenigen zu identifizierenden Pins300Ohm oder 1kOhm zwischen diesem Pin und VCC behoben werden3,3V oder 5V), sonst werden Board oder Seriell-Adapter beschädigtopenocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE: Focaccia-Board-Referenz$BOARDCONFIGFILE: die Konfigurationsdatei des Boards, das gehackt wird (nützlich, aber vielleicht nicht vorhanden, optional)
/usr/local, vielleicht findet man dort nützliche $BOARDCONFIGFILEtelnet localhost 4444
halt: CPU anhalten (wie einfrieren)
reset: CPU zurücksetzenreg: CPU-Register auslesenflash info bank $BANKID oder flash info $BANKID: Informationen über Flash-Speicherbank $BANKID anzeigen (ich denke, Banken = Speicherabschnitte)flash list: eine Liste assoziativer Arrays für jedes Gerät abrufen, das mit flash bank deklariert wurde (in $BOARDCONFIGFILE), nummeriert ab Nullflash banks: eine einzeilige Zusammenfassung jedes Geräts ausgeben, das mit flash bank deklariert wurde (in $BOARDCONFIGFILE), nummeriert ab NullU-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048: Seitengröße (Bytes)mtd->oobsize=64: Daten für Fehlerkorrektur (Bytes)devinfo.iowidth=8: Daten pro Schreib-/Lesevorgang (Bytes)mtd->erasesize=131072: Verbleibende Schreibvorgänge des EEPROM? (mehr oder weniger)init started oder ähnlichem suchen, dies wird wahrscheinlich in der Nähe von BusyBox oder ähnlichem seinhelp-Befehl ist dein Freundbinwalk, file und hexdump -C verwenden, um zu prüfen, ob die ausgelesene Datei in Ordnung ist und ob sie komprimiert oder verschlüsselt ist
binwalk -E die Entropie der Datei analysieren
1: zufällige, komprimierte oder verschlüsselte Datei1: normale ausführbare Datei oder Dateibinwalk -e verwenden, um identifizierbare Segmente der Datei zu extrahierenbinwalk das ausgelesene Image nicht vollständig versteht, könnte die EEPROM-Partitionstabelle (falls zuvor gefunden) verwendet werden, um das Image manuell in mehrere nützliche Images aufzuteilen
dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITEsha1sum, md5sum oder binwalk -W -i zum Vergleichen von Images (wenn wir z.B. denken, sie könnten identisch sein)binwalk (oder dd, wenn wir online finden, wie unser spezifisches Kernel-Image strukturiert ist) extrahieren, um das Root-Dateisystem zu lesenfakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
fakeroot: eine gefälschte Root-Umgebung erstellen, nützlich zum Emulieren von Dateiberechtigungen, Gerätedateien...
-s fakeroot.dat: gefälschte Root-Umgebung speichern, um sie später mit fakeroot -i fakeroot.dat bash wiederherzustellenusquashfs: squashfs-Dateisystem extrahieren (könnte in Ihrem Fall anders sein)
-d squashfs-root: Zielordneru04-sqfs.dat: zu extrahierendes Dateisystem-Imagefactory mode-Zeichenfolge suchen; wenn es gelingt, das Gerät in den Werksmodus zu versetzen (falls vorhanden), ist das Hacken viel einfachergrepfindxargsstringslibfoo.X.Y.ZX.Y.ZX: inkompatibles ABIY: abwärtskompatibles ABIZ: keine ABI-ÄnderungenX.Y gleich der Originalbibliothek
X, höheres YMit einem Build-System bauen (Features auswählen und Abhängigkeiten automatisch verfolgen)
Emulation starten
#!/bin/bash
# Dieses Skript erstellt eine Umgebung ohne Passwort für Benutzer root
export QEMU_AUDIO_DRV="none" # Audio-Treiber ignorieren
qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # Siehe Punkt 2
-m $RAMSIZE \
-kernel $KERNELPATH \
-nographic \ # Keine GUI
-hda $FILESYSTEM \
-net nic,model=$NETCARDMODEL \ # Netzwerkkartenmodell, Treiber muss im Kernel enthalten sein
-net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 für SSH und 9000 für GDB-Server
-no-reboot \ # Maschine beim Herunterfahren beenden
-append "root=/dev/hda console=uart0" # Root-Dateisystem und Konsole festlegen
LD_LIBRARY_PATH wie folgt setzen (innerhalb der Maschine): export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER#!/bin/bash
# Teil 1: Bytes für Kernelmodul identifizieren
modprobe nandsim first_id_byte=$FIRSTBYTE \
second_id_byte=$SECONDBYTE \
third_id_byte=$THIRDBYTE \
fourth_id_byte=$FOURTHBYTE \
cache_file=/root/nandsim.bin \
parts=x,y,z,... # Partitionsgröße in Anzahl der Löschblöcke definieren; die Anzahl der Partitionen hängt vom Gerät ab, Partitionen werden normalerweise beim Booten ausgegeben
# Teil 2: Erstellte Partitionen löschen (EEPROM-Partitionen analysieren)
flash_erase /dev/mtd0 0 8
flash_erase /dev/mtd1 0 20
# ...
# Teil 3: Vom Gerät ausgelesene Partitionen in die gerade erstellten laden
nandwrite /dev/mtd0 part0.bin
nandwrite /dev/mtd1 part1.bin
# ...
# Teil 4: Einhängepunkt für Dateisystem erstellen und anhängen (falls UBIFS)
mkdir /mnt/filesystem
ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM# Teil 5: Mount
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND ID, die ausgegebenen Bytes sind in der Reihenfolge erstes, zweites und viertes Bytewritesize, oobsize, erasesize, iowidth verwenden, um hier den richtigen Befehl zu findenflash_erase-Befehl ist ihre Größe in Relation zur erasesize (gleich wie parts=x,y,z,...)-O: Gibt den Volume-ID-Header-Offset an. Bei falscher Angabe sollte das System trotzdem den richtigen Wert anzeigen; du kannst verschiedene Werte wie 512, 1024, 2048 ausprobieren (Versuch und Irrtum)-m: mtd-Gerätenummer (siehe Punkt 3)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L (oder siehe man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)make manual aus, um das Buildroot-Handbuch zu erstellenmake help zeigt Buildroot alle unterstützten Geräte (Boards) an; make $YOURBOARDNAME erstellt eine Buildroot-Konfigurationsdatei für dein Boardmake menuconfig (textbasiert) oder make xconfig (GUI) wählen wir Kernelmodule aus, die zu unserem Build hinzugefügt werden sollen. Wir verwenden make xconfig
Edit->Find zum Suchen von ModulenTarget options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols mit höchster debug levelStrip command for binaries on target auf NoneGCC optimization level auf 0Toolchain
Toolchain type auf Buildroot toolchainmake savedconfigmake linux-menuconfig (textbasiert) oder make linux-xconfig (GUI), hier verwenden wir die CLI-Version
Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulatorKernel type -> Device drivers -> -> -> uClibc (oder deine C-Bibliothek) mit uclibc-menuconfig (wie immer)
Development/Debugging options -> Enable debugging symbols, falls dies nicht funktioniert (Kompilierungsfehler), dann Development/Debugging options -> (Wall) compiler warnings -> füge -Wall -ggdb -g3 hinzu
-ggdb: stellt Debug-Informationen für die Verwendung mit GDB bereit-g3: stellt zusätzliche Debug-Informationen bereitSavemake, bei Problemen gehe zurück zu früheren Schritten
Need to use -fPIC
--enable-shared in den Kernelmodulen (Punkt 7) unter Toolchain -> Additional gcc options hinzu oder patche Buildrootbr2)
+-- board/
| +-- <company>/ (not always used)
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- kernel-defconfig (kernel config file)
| +-- <other configuration files>
| +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
| +-- post_image.sh
| +-- rootfs_overlay/ (everythin here will be copied in the final image)
| | +-- etc/
| | +-- <some file>
| +-- patches/
| +-- foo/
| | +-- <some patch>
| +-- libbar/
| +-- <some other patches>
|
+-- configs/
| +-- <boardname>_defconfig (buildroot config for our board)
| +-- uClibc.config (optional)
+-- patches/
| +-- (here patches to be applied)
|
+-- Config.in (if using a br2-external tree)
+-- external.mk (if using a br2-external tree)
+-- external.desc (if using a br2-external tree)
make BR2_EXTERNAL=$PATHTOEXTTREE $COMMANDmake BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig| PIN | GND-Widerstand | VCC-Widerstand | V | Anmerkungen |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Beispiel
| PIN | GND-Widerstand | VCC-Widerstand | V | Anmerkungen |
|---|---|---|---|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V beim Boot - TX |
| 3 | INFOhm (Multimeter 1) | INFOhm (Multimeter 1) | 3.3V | 0V beim Boot - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
200kOhmGND (Multimeter auf Spannungsmessung, normalerweise 20V)Tabelle
| PIN | GND-Widerstand | VCC-Widerstand | V | Anmerkungen |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
Beispiel
Starting channel: Kanal, an dem Pin 1 des Boards angeschlossen istEnding channel: Kanal, an dem Pin n des Boards angeschlossen istAlready known pins: Nein, könnte den Prozess aber beschleunigen, falls bereits einige Pins bekannt sindflash write_image erase "$BINTOWRITE" $ADDRTOSTART$BINTOWRITE: kann bin (Binär), ihex (Intel Hex), elf (ELF-Datei), s19 (Motorola s19), mem... sein$ADDRTOSTART: Startadresse (ich denke, Standard ist 0)flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: Speicher auslesen
$OUTFILE: Ausgabedatei für den Dump$ADDRTOSTART: Startadresse (ich denke, Standard ist 0)$SIZETODUMP: Anzahl der auszulesenden Bytes-d: UBI-Gerätenummer (siehe Punkt 5)Kernel headers auf Manually specified linux versionCustom kernel headers series auf $DEVICEKERNELVERSIONLinux version auf $DEVICEKERNELVERSIONC library auf $DEVICECLIBRARY$DEVICECLIBRARY version auf $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesEnable IPv6Enable RPCEnable WCHARThread library implementation auf linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version auf $LATESTGDBVERSIONSystem configuration
Passwords encoding auf MD5Init system auf $DEVICEINITSYSTEM (oder BusyBox)/dev management auf Dynamic using devtmpfs only/bin/sh auf Busybox default shellInstall timezone infoKernel
Kernel version auf $DEVICEKERNELVERSIONKernel binary format auf vmlinuxTarget packages
Compressors and decompressors
bzip2 and xz-utilsDebugging profiling and benchmark
gdb und full debuggerDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools (oder was du benötigst)Libraries
Crypto
libsha1libssh2opensslJSON/XML
expatjson-cNetworking applications
rsync und was du benötigstShell and utilities
fileFilesystem images
ext2Host utilities (nicht über das Zielgerät, hier sprechen wir über das Hostgerät)
host mtd, jffs2 and ubi/ubifs toolshost util-linuxMemory technology device (MTD) supportUBI - Unsorted block imagesEnable UBIFile systems -> Miscellaneous filesystem -> JFFS2 supportFile systems -> Miscellaneous filesystem -> UBIFS filesystem supportSavemake BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfigmake BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig| PIN | GND-Widerstand | VCC-Widerstand | V | Anmerkungen |
|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (Multimeter 1) | INFOhm (Multimeter 1) | 2.1V | Hochimpedant, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (Multimeter 1) | INFOhm (Multimeter 1) | 0V | Nicht verbunden? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (Multimeter 1) | INFOhm (Multimeter 1) | 0V | Nicht verbunden? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |