
Hardware Hacking Cheatsheet
[[TOC]]
250-350 CVCC et GND bien exposés est très utileTODO SPI DUMP
TODO GDB ATTACH????
/etc/rc/etc/rc.local/etc/rc.conf pour plus d'informations/etc/rc.d//etc/inittab
runlevel
1 : mode mono-utilisateur, shell root, pas de mot de passe, aucun démon en cours3 : mode multi-utilisateurs en texte, invite de connexion5 : connexion graphique/etc/init.d/fileRepérer le format exécutable de QEMU : qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipselSi vous connaissez la famille de processeurs, vous pouvez la spécifier pour aider QEMU à mieux émuler l'environnement
$QEMUBIN -cpu helpNous avons besoin du noyau et du système de fichiers racine
Trouver la version du noyau, la version de libc et la liste des bibliothèques utilisées par l'exécutable qui nous intéresse (readelf -d $EXECUTABLE)
GNDINRXOUTTXVCC3/4 broches sur le PCB
GND
GNDVCC
VCCGND (multimètre en mesure de résistance, généralement 200k)VCC (multimètre en mesure de résistance, généralement 200kOhm)GND (multimètre en mesure de tension, généralement 20V)TX par rapport à GND (multimètre en mesure de tension, généralement 20V) ; si la tension oscille, cette broche est probablement TX (car elle envoie des données)RX par rapport à GND (multimètre en mesure de tension, généralement 20V) ; si la tension reste bloquée à 0, cette broche est probablement RX (car elle attend de recevoir des données)Tableau
115200)H est la fonction d'affichage de l'aide, utilisez-la partoutGND de la carte au GND du Jtagulator, les broches 1,2,3 de la carte aux canaux 1,2,3 du JtagulatorV : régler la tension de fonctionnementU : entrer dans le menu d'identification UARTU : démarrer l'identificationText string to output : par défautStarting channel : canal où nous avons mis la broche 1 de la carteEnding channel : canal où nous avons mis la broche 3 de la carteIgnore non-printable characters : Oui3.3V ou 5V), sinon la carte ou l'adaptateur série seront endommagésRX de la carte à la TX de l'adaptateur et la TX de la carte à la RX de l'adaptateur
VCC n'est pas nécessairesudo lsusb pour localiser l'adaptateurls -lart /dev pour localiser tous les fichiers de périphériques ; le nôtre devrait être parmi les derniers, généralement ttyUSB0dialout (ou être root) ; pour vérifier nos groupes groups $USERscreen /dev/ttyUSB0 $BAUDRATE pour s'attacher au TTY
$BAUDRATE peut être l'un de ceux trouvés ici$BAUDRATE les plus courants
1152009600576003840019200$BAUDRATE, on pourrait voir du charabia ou même RIENctrl + a -> k -> y : fermer screenRX semble ne pas fonctionner (vous tapez et appuyez sur Entrée mais rien ne se passe), il se peut que la valeur de « retour » soit incorrecte : \r\n ou \n ?
pyserial, la bibliothèque Python pour la communication série, exemple :
#!/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 ou 1TCK, TDI, TDO, TMS et TRST (facultatif)
TCK (Test Clock) : le batteur, ou métronome qui dicte la vitesse du contrôleur. La tension sur cette broche pulse simplement de haut en bas à un rythme régulier et constant. À chaque « battement » de l'horloge, le contrôleur effectue une seule action.TMS (Test Mode Select) : les tensions sur la broche Mode Select contrôlent l'action que JTAG effectue. En manipulant la tension sur cette broche, vous dites à JTAG ce que vous voulez qu'il fasse.TDI (Test Data-In) : la broche qui achemine les données vers la puce. La norme JTAG ne définit pas de protocoles de communication pour cette broche. Cela est laissé au fabricant. En ce qui concerne JTAG, cette broche est simplement une méthode d'entrée pour des 1 et des 0 dans la puce. Ce que la puce en fait est sans importance pour JTAG.TDO (Test Data-Out) : la broche pour les données sortant de la puce. Comme pour la broche Data-In, les protocoles de communication ne sont pas définis par JTAG.TRST (Test Reset, facultatif) : ce signal est utilisé pour réinitialiser JTAG à un état sain connu.5/6 broches ou une double rangée de 10, 12, 14, 20 broches sur le PCB
GND
GNDVCC
VCCGND (multimètre en mesure de résistance, généralement 200k)VCC (multimètre en mesure de résistance, généralement )115200)H est la fonction d'affichage de l'aide, utilisez-la partoutGND de la carte à GND du Jtagulator, les broches 1,2,3... de la carte aux canaux 1,2,3... du JtagulatorV : régler la tension de fonctionnementJ : entrer dans le menu d'identification JTAGI : identifier avec un scan IDCODE, ne trouvera pas TDI (rapide), mieux si j'ai beaucoup de broches à identifierB : identifier avec un scan BYPASS, trouvera (lent), mieux si j'ai moins de broches à identifier300Ohm ou 1kOhm entre cette broche et VCC3.3V ou 5V), sinon la carte ou l'adaptateur série sera endommagéopenocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE : référence de la carte Focaccia$BOARDCONFIGFILE : le fichier de configuration de la carte que vous piratez (utile, mais vous ne l'aurez peut-être pas ; optionnel)
/usr/local, vous pourriez peut-être y trouver un $BOARDCONFIGFILE utiletelnet localhost 4444
halt : arrête le CPU (comme un gel)
reset : réinitialise le CPUreg : lit les registres du CPUflash info bank $BANKID ou flash info $BANKID : affiche des informations sur la banque de mémoire flash $BANKID (je pense que les banques = blocs de mémoire)flash list : récupère une liste de tableaux associatifs pour chaque périphérique déclaré avec flash bank (dans $BOARDCONFIGFILE), numérotée à partir de zéroflash banks : affiche un résumé sur une ligne de chaque périphérique déclaré avec flash bank (dans $BOARDCONFIGFILE), numéroté à partir de zéroU-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048 : taille de page (octets)mtd->oobsize=64 : données utilisées pour la correction d'erreurs (octets)devinfo.iowidth=8 : données écrites/lues par opération (octets)mtd->erasesize=131072 : écritures restantes de l'EEPROM ? (plus ou moins)init started ou quelque chose de similaire, cela se trouvera probablement près de la chaîne BusyBox ou quelque chose d'analoguehelp est votre amiebinwalk, file et hexdump -C pour vérifier si le fichier extrait est bon ou non et s'il est compressé ou chiffré
binwalk -E, nous analysons l'entropie du fichier
1 : fichier aléatoire, compressé ou chiffré1 : exécutable ou fichier normalbinwalk -e pour extraire les segments identifiables du fichierbinwalk ne comprend pas entièrement l'image extraite, nous pouvons utiliser la table des partitions de l'EEPROM (si elle a été trouvée précédemment) pour diviser manuellement l'image extraite en plusieurs images utiles
dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITEsha1sum, md5sum ou binwalk -W -i pour comparer des images (si par exemple nous pensons qu'elles pourraient être la même image)binwalk (ou dd si nous pouvons trouver en ligne comment notre image de noyau spécifique est structurée) pour lire le système de fichiers racinefakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
fakeroot : créer un environnement racine factice, utile pour émuler les permissions de fichiers, les fichiers de périphériques...
-s fakeroot.dat : enregistrer l'environnement racine factice pour le restaurer ensuite avec la commande fakeroot -i fakeroot.dat bashusquashfs : extraire le système de fichiers squashfs (peut être différent dans votre cas)
-d squashfs-root : dossier de destinationu04-sqfs.dat : image du système de fichiers à extraire/sbin/init en recherchant des informations (ci-dessus) identifiant les typesfactory mode ; si nous réussissons à mettre l'appareil en mode usine (s'il existe), alors le pirater est beaucoup plus facilegrepfindxargsstringslibfoo.X.Y.Z (X.Y.Z est la version)
X : ABI incompatibleY : ABI rétrocompatibleZ : aucun changement d'ABIX.Y égal à celui de la bibliothèque d'origine
X, Y plus élevéConstruire à l'aide d'un système de build (sélectionner les fonctionnalités et suivre automatiquement les dépendances)
Commencer l'émulation
#!/bin/bash
# This script will build an environment without password for the user root
export QEMU_AUDIO_DRV="none" # ignore audio drivers
qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
-m $RAMSIZE \
-kernel $KERNELPATH \
-nographic \ # No GUI
-hda $FILESYSTEM \
-net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
-net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
-no-reboot \ # Terminate the machine when is halted
-append "root=/dev/hda console=uart0" # Set root filesystem and console
LD_LIBRARY_PATH comme suit (dans la machine) : export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER#!/bin/bash
# Part 1: Identify bytes for kernel module
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,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
# Part 2: Erase partitions created (analyze EEPROM partitions)
flash_erase /dev/mtd0 0 8
flash_erase /dev/mtd1 0 20
# ...
# Part 3: Load partitions dumped from device in the ones just created
nandwrite /dev/mtd0 part0.bin
nandwrite /dev/mtd1 part1.bin
# ...
# Part 4: Create mountpoint for filesystem and attach (if UBIFS)
mkdir /mnt/filesystem
ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
```# Partie 5 : Montage
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND ID ; les octets affichés sont dans l'ordre premier, deuxième et quatrième octetwritesize, oobsize, erasesize, iowidth pour trouver ici la commande correcteflash_erase correspond à leur taille corrélée au erasesize (comme parts=x,y,z,...)-O : spécifier l'offset de l'en-tête d'ID de volume ; si la valeur est fausse, le système devrait vous indiquer la bonne valeur, sinon vous pouvez essayer différentes valeurs comme 512, 1024, 2048 (essai et erreur)-m : numéro du périphérique mtd (voir point 3)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L (ou consultez man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)make manual pour créer le manuel de buildrootmake help, buildroot affiche tous les périphériques pris en charge (cartes) ; make $YOURBOARDNAME pour créer un fichier de configuration buildroot de votre cartemake menuconfig (en mode texte) ou make xconfig (GUI) pour sélectionner les modules noyau à ajouter à notre compilation ; nous utiliserons make xconfig
Edit->Find pour rechercher des modulesTarget options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols avec le debug level le plus élevéStrip command for binaries on target sur NoneGCC optimization level sur 0Toolchain
Toolchain type sur Buildroot toolchainmake savedconfigmake linux-menuconfig (mode texte) ou make linux-xconfig (GUI) ; ici nous utiliserons la version CLI
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 (ou votre bibliothèque C) avec uclibc-menuconfig (comme toujours)
Development/Debugging options -> Enable debugging symbols ; si cela ne fonctionne pas (erreurs de compilation), alors Development/Debugging options -> (Wall) compiler warnings -> ajouter -Wall -ggdb -g3
-ggdb : fournit les informations de débogage à utiliser avec GDB-g3 : fournit des informations de débogage supplémentairesSavemake ; en cas de problèmes, revenez en arrière
Need to use -fPIC
--enable-shared dans les modules noyau (point 7) sous Toolchain -> Additional gcc options ou patcher 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| BROCHE | Résistance GND | Résistance VCC | V | Remarques |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Exemple
| BROCHE | Résistance GND | Résistance VCC | V | Remarques |
|---|---|---|---|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V au boot - TX |
| 3 | INFOhm (multimètre 1) | INFOhm (multimètre 1) | 3.3V | 0V au boot - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
200kOhmGND (multimètre en mesure de tension, généralement 20V)Tableau
| BROCHE | Résistance GND | Résistance VCC | V | Remarques |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
Exemple
TDICanal de départ : canal où nous mettons la broche 1 de la carteCanal de fin : canal où nous mettons la broche n de la carteBroches déjà connues : Non, mais cela pourrait accélérer le processus si nous connaissons déjà certaines brochesflash write_image erase "$BINTOWRITE" $ADDRTOSTART : flasher la mémoire
$BINTOWRITE : peut être bin (binaire), ihex (Intel hex), elf (fichier ELF), s19 (Motorola s19), mem...$ADDRTOSTART : adresse où commencer l'écriture (je pense que la valeur par défaut est 0)flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP : vider la mémoire
$OUTFILE : fichier binaire dans lequel enregistrer le dump$ADDRTOSTART : adresse où commencer la lecture (je pense que la valeur par défaut est 0)$SIZETODUMP : nombre d'octets à vider-d : numéro du périphérique UBI (voir point 5)Kernel headers sur Manually specified linux versionCustom kernel headers series sur $DEVICEKERNELVERSIONLinux version sur $DEVICEKERNELVERSIONC library sur $DEVICECLIBRARY$DEVICECLIBRARY version sur $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesEnable IPv6Enable RPCEnable WCHARThread library implementation sur linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version sur $LATESTGDBVERSIONSystem configuration
Passwords encoding sur MD5Init system sur $DEVICEINITSYSTEM (ou BusyBox)/dev management sur Dynamic using devtmpfs only/bin/sh sur Busybox default shellInstall timezone infoKernel
Kernel version sur $DEVICEKERNELVERSIONKernel binary format sur vmlinuxTarget packages
Compressors and decompressors
bzip2 et xz-utilsDebugging profiling and benchmark
gdb et full debuggerDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools (ou ce dont vous aurez besoin)Libraries
Crypto
libsha1libssh2opensslJSON/XML
expatjson-cNetworking applications
rsync et ce dont vous avez besoinShell and utilities
fileFilesystem images
ext2Host utilities (il ne s'agit pas du périphérique cible, nous parlons ici du périphérique hôte)
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| BROCHE | Résistance GND | Résistance VCC | V | Remarques |
|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (multimètre 1) | INFOhm (multimètre 1) | 2.1V | Haute impédance, TDO ? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (multimètre 1) | INFOhm (multimètre 1) | 0V | Non connecté ? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (multimètre 1) | INFOhm (multimètre 1) | 0V | Non connecté ? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |