Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Hardware Hacking Cheatsheet — Hardware Hacking Cheatsheet | Kitploit
Outils/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
Sécurité des Systèmes EmbarquésSécurité IoTSécurité MatérielleApprentissage et ÉducationRessources OrganiséesAnalyse de Micrologiciel
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

Hardware Hacking Cheatsheet

Voir le dépôt
23il y a 5 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Aide-mémoire de hacking matériel

[[TOC]]

Avertissement

  • Je suis un noob qui essaie d'apprendre ce genre de choses, donc certains points ne sont peut-être pas 100 % corrects
  • Désolé pour mon mauvais anglais

Remarques

  • Suivre d'abord la méthodologie du chemin le plus facile
  • Parfois, vous devrez souder des éléments ; ici un guide rapide et simple
    • Vous devrez peut-être souder des fils directement sur les vias du PCB (vidéo)
      1. Grattez la surface du PCB avec un cutter jusqu'à voir le cuivre brillant sous le masque de soudure
      2. Grattez à nouveau la surface avec un crayon en fibre de verre
      3. Nettoyez la surface avec de l'alcool isopropylique et un coton-tige
      4. Appliquez un peu de flux
      5. Étamez le fil et soudez
    • Remarques
      • Étamez toujours la pointe de votre fer à souder
      • Température : 250-350 C
      • Ne touchez pas le PCB avec les mains

Collecte d'informations et première interaction

  1. Regardez l'étiquette à l'arrière de l'appareil et recherchez
    • Le nom du modèle
    • Le numéro de série
    • La société qui a marqué l'appareil (peut ne pas être celle qui l'a fabriqué)
  2. Recherchez sur Internet en utilisant les informations que vous venez de recueillir
    • Meilleurs sites web contenant des informations
      • TechInfoDepot
      • OpenWRT
    • Recherchez ..., cela mène généralement à beaucoup d'informations
      • FCC ID (site de référence)
      • Nom du SOC
      • Nom et capacité de la puce flash
      • Nom et capacité de la puce RAM
      • Autres sources d'informations possibles
  3. Ouvrez l'appareil
    • Recherchez des tutoriels sur la façon d'ouvrir l'appareil
    • Certains appareils peuvent être collés pour empêcher l'ouverture, soyez doux
    • Parfois, il y a des dissipateurs thermiques qui couvrent une partie du circuit ; si possible, retirez-les
  4. Identifiez les composants
    • Pour rendre les noms des circuits plus lisibles
      • Utilisez du coton + de l'alcool ; une fois l'alcool sec, recouvrez le circuit de craie, puis nettoyez-le ; le nom du circuit devrait maintenant être lisible
      • Utilisez une loupe
    • Recherchez des informations et des fiches techniques sur Internet concernant ces composants ; si rien n'est trouvé, essayez sur les moteurs de recherche chinois
      • Baidu
      • Sogou
      • Haosou
    • IMPORTANT : trouver un composant avec VCC et GND bien exposés est très utile
  5. Localisez l'interface UART : plus ou moins un TTY
    • Recherchez sur Internet
    • Recherchez sur le PCB les mentions , ou , ou et

TODO SPI DUMP

TODO GDB ATTACH????

Rétro-ingénierie

  1. Type de processus init et fichiers de configuration
    • Types
      • Style BSD
        • Commence à exécuter des scripts dans
          • /etc/rc
          • /etc/rc.local
        • Plus récent
          • Voir /etc/rc.conf pour plus d'informations
          • Exécute /etc/rc.d/
      • System V (le plus populaire)
        • BusyBox est démarré
        • Les fichiers de configuration se trouvent dans /etc/inittab
          • runlevel
            • 1 : mode mono-utilisateur, shell root, pas de mot de passe, aucun démon en cours
            • 3 : mode multi-utilisateurs en texte, invite de connexion
            • 5 : connexion graphique
          • Ensuite, il y a une liste d'actions effectuées à l'init
        • Exécute /etc/init.d/
      • Systemd (pas utilisé dans l'embarqué)
    • Comment l'identifier
      • Affiché au démarrage

Environnement d'émulation

  • Prérequis
    • Connaître l'architecture CPU du fichier binaire
      • Simple en utilisant la commande file
    • QEMU doit prendre en charge cette architecture
  • Émulation QEMU (modes)
    • Mode système : émuler le système entier
      • Comment faire
        1. Repérer le format exécutable de QEMU : qemu-system-$PROCESSOR$ARCHITECTURE

          • Exemple : qemu-system-mipsel
        2. Si vous connaissez la famille de processeurs, vous pouvez la spécifier pour aider QEMU à mieux émuler l'environnement

          • Pour obtenir la liste des familles prises en charge : $QEMUBIN -cpu help
          • Il est toujours préférable de commencer avec une famille de CPU générale, puis si quelque chose ne fonctionne pas, essayez d'approfondir et d'utiliser des familles de CPU spécifiques
        3. Nous avons besoin du noyau et du système de fichiers racine

          • Remarques
            • Le noyau de l'appareil n'est pas bon pour les pilotes manquants
            • Il n'y a pas de standardisation dans le monde de l'IoT
              • Utiliser le device tree du noyau : fichier texte définissant les pilotes de la carte
                • Au démarrage, le noyau chargera ce fichier et adaptera les pilotes génériques à la carte utilisée
                • Pas tellement utilisé
            • DONC.. RECONSTRUIRE LE NOYAU ET LE SYSTÈME DE FICHIERS
          1. 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)

Sources, crédits et remerciements

  • Merci à Valerio Di Giampietro (@valerio) pour son incroyable chaîne de tutoriels youtube sur le hardware hacking ; tout ce qui est écrit ici est en grande partie tiré de ces vidéos.
  • Merci à Luca Bongiorni (@LucaBongiorni) pour ses précieux conseils et outils matériels.
  • Merci à mightyohm.com pour les Soldering comics
  • Merci à la communauté Reddit hardwarehacking pour son aide
    • [Noob] Soudure directe de PCB (peut-être ?)
  • Merci à Andrew Paul pour le tutoriel sur la soudure des vias
  • Manuel Buildroot
  • JTAG expliqué
  • OpenOCD - Commandes Flash
  • Informations sur OpenOCD + JTAG
  • Aide-mémoire hardware hacking - Petit PDF
  • OpenOCD
Télécharger l’outil
GND
IN
RX
OUT
TX
VCC
  • Recherchez 3/4 broches sur le PCB
    1. Trouvez une référence à GND
      • En utilisant les composants précédemment trouvés
      • Habituellement, les plaques métalliques sont à GND
    2. Trouvez une référence à VCC
      • En utilisant les composants précédemment trouvés
      • Recherchez des condensateurs, ils ont généralement un point à VCC
    3. Testez les broches candidates UART en remplissant le tableau ci-dessous (les puces correspondent respectivement à chaque colonne du tableau)
      1. Testez la résistance des broches UART par rapport à GND (multimètre en mesure de résistance, généralement 200k)
      2. Testez la résistance des broches UART par rapport à VCC (multimètre en mesure de résistance, généralement 200kOhm)
      3. Mettez l'appareil sous tension et testez la tension des broches UART par rapport à GND (multimètre en mesure de tension, généralement 20V)
      4. Mettez l'appareil sous tension et PENDANT LE BOOT, testez la tension de la broche UART suspectée d'être 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)
      5. Mettez l'appareil sous tension et PENDANT LE BOOT, testez la tension de la broche UART suspectée d'être 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

  • Utilisez Jtagulator
    1. Connectez-le à l'ordinateur (débit en bauds : 115200)
    2. IMPORTANT : H est la fonction d'affichage de l'aide, utilisez-la partout
    3. Connectez le GND de la carte au GND du Jtagulator, les broches 1,2,3 de la carte aux canaux 1,2,3 du Jtagulator
    4. V : régler la tension de fonctionnement
    5. U : entrer dans le menu d'identification UART
    6. U : démarrer l'identification
    7. Text string to output : par défaut
    8. Starting channel : canal où nous avons mis la broche 1 de la carte
    9. Ending channel : canal où nous avons mis la broche 3 de la carte
    10. Ignore non-printable characters : Oui
    11. Terminé !
  • TODO : - Utiliser BurtleinaBoard + Busside
  • Connectez-vous via UART : utilisez un adaptateur série (UART -> USB) pour connecter la carte à un ordinateur
    • Adaptateur série choisi : FT232H + Focaccia Board
    1. Choisissez la tension appropriée (3.3V ou 5V), sinon la carte ou l'adaptateur série seront endommagés
    2. Connectez la RX de la carte à la TX de l'adaptateur et la TX de la carte à la RX de l'adaptateur
      • REMARQUE : généralement, connecter la broche VCC n'est pas nécessaire
    3. Connectez l'adaptateur à l'ordinateur
      1. sudo lsusb pour localiser l'adaptateur
      2. ls -lart /dev pour localiser tous les fichiers de périphériques ; le nôtre devrait être parmi les derniers, généralement ttyUSB0
      3. Pour accéder à ce périphérique, nous devons faire partie du groupe dialout (ou être root) ; pour vérifier nos groupes groups $USER
      4. screen /dev/ttyUSB0 $BAUDRATE pour s'attacher au TTY
        • $BAUDRATE peut être l'un de ceux trouvés ici
        • Les $BAUDRATE les plus courants
          • 115200
          • 9600
          • 57600
          • 38400
          • 19200
        • IMPORTANT : si on foire le $BAUDRATE, on pourrait voir du charabia ou même RIEN
        • ctrl + a -> k -> y : fermer screen
    • Si la broche RX 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 ?
      • Pour résoudre ce problème, utilisez pyserial, la bibliothèque Python pour la communication série, exemple :
        root@kitploit:~
        #!/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")
        
      • Si le problème persiste, utilisez un analyseur logique (ici un modèle pas cher)
  • Localisez l'interface JTAG
    • Qu'est-ce que JTAG : l'interface JTAG offre aux fabricants un moyen de tester les connexions physiques entre les broches d'une puce. Lorsque les ingénieurs électriciens parlent d'utiliser JTAG pour « déboguer » une puce, ils parlent de quelque chose de très différent du débogage logiciel traditionnel. Ils veulent s'assurer que la broche A de la puce A est physiquement connectée à la broche B de la puce B, et que toutes ces broches fonctionnent correctement. Étant donné que JTAG donne un accès matériel direct à un appareil, c'est aussi un outil fantastique pour la recherche en sécurité.
    • Propriétés de JTAG
      • Contrôlabilité : régler les bits internes à 0 ou 1
      • Observabilité : vérifier la valeur des bits internes
      • ... donc lire/écrire l'EEPROM
      • Débogage in-circuit : déboguer le code sur le circuit (en utilisant par exemple OpenOCD et GDB)
    • Recherchez sur Internet
    • Recherchez sur le PCB les mentions TCK, 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.
    • Recherchez une rangée de 5/6 broches ou une double rangée de 10, 12, 14, 20 broches sur le PCB
      1. Trouvez une référence à GND
        • En utilisant les composants précédemment trouvés
        • Habituellement, les plaques métalliques sont à GND
      2. Trouvez une référence à VCC
        • En utilisant les composants précédemment trouvés
        • Recherchez des condensateurs, ils ont généralement un point à VCC
      3. Testez les broches candidates JTAG en remplissant le tableau ci-dessous (les puces correspondent respectivement à chaque colonne du tableau)
        1. Testez la résistance des broches JTAG par rapport à GND (multimètre en mesure de résistance, généralement 200k)
        2. Testez la résistance des broches JTAG par rapport à VCC (multimètre en mesure de résistance, généralement )
    • Utiliser Jtagulator
      1. Connectez-le à l'ordinateur (débit en bauds : 115200)
      2. IMPORTANT : H est la fonction d'affichage de l'aide, utilisez-la partout
      3. Connectez la broche GND de la carte à GND du Jtagulator, les broches 1,2,3... de la carte aux canaux 1,2,3... du Jtagulator
      4. V : régler la tension de fonctionnement
      5. J : entrer dans le menu d'identification JTAG
      6. Là, nous avons deux options
        • I : identifier avec un scan IDCODE, ne trouvera pas TDI (rapide), mieux si j'ai beaucoup de broches à identifier
        • B : identifier avec un scan BYPASS, trouvera (lent), mieux si j'ai moins de broches à identifier
    • TODO: - Utiliser BurtleinaBoard + Busside
    • IMPORTANT
      • Le JTAG peut avoir été désactivé (matériel, en retirant une résistance) il est donc possible que ce que vous trouvez avec le multimètre et le Jtagulator ne soit pas cohérent ; nous pouvons résoudre ce problème en plaçant une résistance d'environ 300Ohm ou 1kOhm entre cette broche et VCC
      • Le JTAG peut avoir été désactivé (matériel, en retirant une résistance) ; ce problème peut être résolu en remettant cette résistance ou en faisant une connexion directe en court-circuitant les pastilles de la résistance
      • Le JTAG peut avoir été désactivé (logiciel, en définissant certaines valeurs)
      • Le JTAG peut avoir été désactivé (matériel, en grillant un fusible... dans ce cas, il n'y a aucun espoir)
  • Connectez-vous via JTAG : utilisez un "adaptateur série" (JTAG -> USB) pour connecter la carte à un ordinateur
    • "Adaptateur série" choisi : FT232H + Focaccia Board
    1. Choisissez la tension appropriée (3.3V ou 5V), sinon la carte ou l'adaptateur série sera endommagé
    2. En utilisant le brochage JTAG trouvé précédemment, connectez tout ensemble
    3. Gardez la connexion UART ouverte (comme expliqué précédemment) pour interagir avec le périphérique et observer son comportement
    4. Lancez OpenOCD
      • Première fenêtre (serveur OpenOCD) : 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)
          • Remarques
            • Les fichiers de configuration se trouvent dans /usr/local, vous pourriez peut-être y trouver un $BOARDCONFIGFILE utile
            • Sinon, vous pouvez chercher sur Internet
            • Sinon, vous pouvez l'écrire vous-même
            • TODO (écrivez-le vous-même)
      • Deuxième fenêtre (client OpenOCD) : telnet localhost 4444
        • Commandes utiles
          • halt : arrête le CPU (comme un gel)
            • DOIT ÊTRE FAIT AVANT CHAQUE OPÉRATION DE DÉBOGAGE
          • reset : réinitialise le CPU
          • reg : lit les registres du CPU
          • flash 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éro
          • flash 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éro
  • Obtenir le firmware et le système de fichiers
    • Possibilités (le firmware et le système de fichiers peuvent être chiffrés)
      • Le télécharger depuis le site Web du fabricant
      • Si seul l'appareil peut télécharger le firmware (via une mise à jour), reniflez le réseau avec wireshark pour recueillir des informations
      • Lire l'EEPROM directement à l'aide d'un programmateur de puce flash et d'une pince de test
      • Commande de dump du bootloader
        1. Analyser le journal de démarrage imprimé sur l'interface UART
          • Informations qui peuvent être imprimées et qui nous intéressent (les valeurs sont des exemples mais expliquent ce que nous recherchons)
            • Informations générales sur le bootloader
              • Rechercher le nom et la version du bootloader (ex. : U-Boot 1.1.3)
            • Informations sur le SoC
              • Informations supplémentaires sur les cartes (wifi, ethernet...), elles peuvent embarquer leur propre bootloader
              • Modèle du SoC (ex. : ASIC MT7621A...)
              • Fréquence du CPU
            • Informations sur la RAM
              • 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)
              • Quantité de RAM
            • Informations sur l'EEPROM
              • mtd->erasesize=131072 : écritures restantes de l'EEPROM ? (plus ou moins)
            • Informations sur le noyau OS
              • Rechercher les informations de chargement du bootloader, ici vous pourriez trouver des informations sur le système de fichiers
              • Rechercher la version de buildroot, cela nous aidera à émuler le circuit et à effectuer divers tests
            • Informations sur le système de fichiers
              • Rechercher les informations de chargement du bootloader et le processus de démarrage de l'OS, ici vous pourriez trouver des informations sur le système de fichiers
            • Partitions de l'EEPROM
              • Rechercher le processus de démarrage de l'OS, ici vous pourriez trouver des informations sur les partitions de l'EEPROM, leurs noms, points de montage et longueur en RAM
              • Si vous voyez des partitions dupliquées, c'est probablement pour les mises à jour du firmware, vous pouvez deviner pourquoi
            • Informations sur le processus init
              • Recherchez init started ou quelque chose de similaire, cela se trouvera probablement près de la chaîne BusyBox ou quelque chose d'analogue
            • Le bootloader a-t-il une CLI ?
              • Cherchez le menu du bootloader, ici nous pourrions probablement trouver la réponse à cette question
        2. Essayez d'obtenir un shell du bootloader (automatiquement ou via un menu affiché via UART)
        3. Explorez le shell du bootloader
          • La commande help est votre amie
          • Essayez de trouver un moyen de vider le contenu de la mémoire, python est votre ami
          • Les données OOB (correction de code d'erreur) ne sont pas très utiles à vider
        4. Analyse des données extraites
          • Utilisez binwalk, file et hexdump -C pour vérifier si le fichier extrait est bon ou non et s'il est compressé ou chiffré
            • Avec binwalk -E, nous analysons l'entropie du fichier
              • Entropie PROCHE de 1 : fichier aléatoire, compressé ou chiffré
              • Entropie INFÉRIEURE à 1 : exécutable ou fichier normal
          • Utilisez binwalk -e pour extraire les segments identifiables du fichier
        5. Si binwalk 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_WRITE
          • sha1sum, md5sum ou binwalk -W -i pour comparer des images (si par exemple nous pensons qu'elles pourraient être la même image)
        6. La dernière opération peut être exécutée plusieurs fois selon ce que contient l'image extraite ; si par exemple nous avons l'image du noyau, nous pourrions extraire ses composants une autre fois avec 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 racine
        7. Extraire le système de fichiers
          • Exemple de commande (selon le type de système de fichiers) : fakeroot -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 bash
            • usquashfs : extraire le système de fichiers squashfs (peut être différent dans votre cas)
              • -d squashfs-root : dossier de destination
              • u04-sqfs.dat : image du système de fichiers à extraire
  • Analyser /sbin/init en recherchant des informations (ci-dessus) identifiant les types
  • Binaires et scripts intéressants
    • Recherchez les fichiers intéressants démarrés par le processus init et en général ne vous arrêtez pas aux noms, examinez en profondeur quel binaire est exécuté et analysez-les ; les plus intéressants sont les non standard
    • Recherchez la chaîne factory mode ; si nous réussissons à mettre l'appareil en mode usine (s'il existe), alors le pirater est beaucoup plus facile
    • Commandes utiles
      • Éditeur de texte
      • grep
      • find
      • xargs
      • strings
    • Format de version de bibliothèque : libfoo.X.Y.Z (X.Y.Z est la version)
      • X : ABI incompatible
      • Y : ABI rétrocompatible
      • Z : aucun changement d'ABI
    • Nous avons donc besoin d'un X.Y égal à celui de la bibliothèque d'origine
      • Acceptable : même X, Y plus élevé
  • Construire à l'aide d'un système de build (sélectionner les fonctionnalités et suivre automatiquement les dépendances)

    • Meilleurs choix de systèmes de build
      • Le projet Yocto
      • Buildroot (le meilleur)
      • Système de build OpenWRT
  • Commencer l'émulation

    • Script d'émulation QEMU
      root@kitploit:~
      #!/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
      
      • Si lors de l'exécution d'un binaire, une erreur concernant des bibliothèques manquantes s'affiche, définissez LD_LIBRARY_PATH comme suit (dans la machine) : export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • Nous pourrions aussi émuler l'EEPROM NAND
      root@kitploit:~
      #!/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
      
      1. Identifier les octets pour le module noyau
        • Pendant le démarrage, les informations sur la NAND sont généralement affichées, observez-les (étapes ci-dessus) et recherchez NAND ID ; les octets affichés sont dans l'ordre premier, deuxième et quatrième octet
        • On peut aussi trouver ces informations en consultant la datasheet de l'EEPROM
        • On peut aussi utiliser writesize, oobsize, erasesize, iowidth pour trouver ici la commande correcte
        • Sinon, essai et erreur
      2. Analyser les partitions EEPROM affichées au démarrage pour trouver leurs tailles et noms ; le dernier nombre de la commande flash_erase correspond à leur taille corrélée au erasesize (comme parts=x,y,z,...)
      3. Charger les partitions dumpées depuis le périphérique dans celles qui viennent d'être créées
      4. Créer un point de montage pour le système de fichiers et attacher
        • -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)
  • Mode utilisateur : comme wine, exécuter simplement un binaire et le « traduire » vers notre architecture
    • Notes
      • Pas très stable
      • Peut donner des résultats étranges
    • Comment faire
      1. Localiser le format exécutable QEMU : qemu-$PROCESSOR$ARCHITECTURE
        • Exemple : qemu-mips64
      2. Si QEMU se plaint d'un interpréteur manquant, passez le chemin DU DOSSIER CONTENANT cet interpréteur avec -L (ou consultez man)
        • Pour savoir quel interpréteur est utilisé par un exécutable, utilisez readelf -l $EXECUTABLE
  • Mode virtualisation : pas intéressant pour nous
  • Construction du noyau et du système de fichiers racine à l'aide de buildroot et docker
    • Notre noyau construit devrait avoir (par rapport au noyau d'origine)
      • Même version du noyau
      • Même version de libc (uClibc, uClibc-ng, musl, dietlibc...)
      • Mêmes versions des bibliothèques (de l'exécutable qui nous intéresse)
    1. Rechercher la version de buildroot la plus proche des versions de notre périphérique
      • Parfois, pendant le démarrage ou l'exploration de la mémoire dumpée, on peut trouver la version de buildroot utilisée (si le périphérique a été construit avec buildroot)
    2. Trouver une version de linux compatible avec la version de buildroot trouvée et créer un conteneur docker, ici un exemple de dockerfile (les paquets sont importants pour exécuter buildroot)
    3. Télécharger la version de buildroot sélectionnée depuis ici et la placer dans le dossier partagé du conteneur docker
    4. Lancer le conteneur docker et basculer dessus
    5. Extraire buildroot et lancer make manual pour créer le manuel de buildroot
    6. Avec make help, buildroot affiche tous les périphériques pris en charge (cartes) ; make $YOURBOARDNAME pour créer un fichier de configuration buildroot de votre carte
    7. make menuconfig (en mode texte) ou make xconfig (GUI) pour sélectionner les modules noyau à ajouter à notre compilation ; nous utiliserons make xconfig
      • Voici un exemple/guide, mais vous devrez découvrir par vous-même quels modules en particulier seront nécessaires pour exécuter vos applications
      • Astuce : Edit->Find pour rechercher des modules
      • Options
        • Target options
          • Cocher Show options and packages that are deprecated or obsolete
          • Cocher Build packages with debugging symbols avec le debug level le plus élevé
          • Cocher Strip command for binaries on target sur None
          • Cocher GCC optimization level sur 0
        • Toolchain
          • Cocher Toolchain type sur Buildroot toolchain
    8. Pour enregistrer définitivement la configuration que vous venez de définir, utilisez make savedconfig
    9. Configurer le noyau avec make linux-menuconfig (mode texte) ou make linux-xconfig (GUI) ; ici nous utiliserons la version CLI
      • Voici un exemple/guide, mais vous devrez découvrir par vous-même quels modules en particulier seront nécessaires pour exécuter vos applications
      • Options
        • 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 simulator
        • Kernel type -> Device drivers -> -> ->
    10. Configurer uClibc (ou votre bibliothèque C) avec uclibc-menuconfig (comme toujours)
      • Activer le débogage : 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émentaires
      • Save
      • Activer les fonctionnalités comme sur notre périphérique (essai et erreur ; si vous obtenez des erreurs, enquêtez puis reconstruisez avec les fonctionnalités nécessaires)
    11. make ; en cas de problèmes, revenez en arrière
      • Erreurs de compilation possibles
        • Need to use -fPIC
          • Ajouter --enable-shared dans les modules noyau (point 7) sous Toolchain -> Additional gcc options ou patcher buildroot
    • Sauvegarder les fichiers de configuration pour buildroot avec git
      • Configuration de l'arbre externe (arborescence des fichiers à faire comprendre à buildroot) (br2)
        root@kitploit:~
        +-- 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)
        
      • Pour utiliser un arbre externe, invoquez buildroot comme ceci : make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • Pour sauvegarder la configuration buildroot dans notre arbre externe : make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
  • BROCHERésistance GNDRésistance VCCVRemarques
    1
    2
    3
    4
    • Exemple

      BROCHERésistance GNDRésistance VCCVRemarques
      130kOhm0Ohm3.3VVCC
      24.7kOhm34kOhm3.3V1.6-3.3V au boot - TX
      3INFOhm (multimètre 1)INFOhm (multimètre 1)3.3V0V au boot - RX
      40Ohm30kOhm0VGND
    200kOhm
  • Mettez l'appareil sous tension et testez la tension des broches JTAG par rapport à GND (multimètre en mesure de tension, généralement 20V)
    • Tableau

      BROCHERésistance GNDRésistance VCCVRemarques
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      ...
      • Exemple

  • Comparez les valeurs trouvées avec les brochages JTAG les plus utilisés, disponibles sur jtagtest
  • TDI
  • Canal de départ : canal où nous mettons la broche 1 de la carte
  • Canal de fin : canal où nous mettons la broche n de la carte
  • Broches déjà connues : Non, mais cela pourrait accélérer le processus si nous connaissons déjà certaines broches
  • Démarrer et attendre.. Terminé !
  • flash 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
  • Plus d'informations ici :
    • OpenOCD PDF
    • OpenOCD HTML
  • TODO
  • -d : numéro du périphérique UBI (voir point 5)
  • Monter
  • Cocher Kernel headers sur Manually specified linux version
  • Cocher Custom kernel headers series sur $DEVICEKERNELVERSION
  • Définir Linux version sur $DEVICEKERNELVERSION
  • Cocher C library sur $DEVICECLIBRARY
  • Cocher $DEVICECLIBRARY version sur $DEVICECLIBRARY $DEVICELIBRARYVERSION
  • Cocher Enable large files
  • Cocher Enable IPv6
  • Cocher Enable RPC
  • Cocher Enable WCHAR
  • Cocher Thread library implementation sur linuxthreads
  • Cocher Thread library debugging
  • Cocher Build cross gdb for the host
  • Cocher TUI support
  • Cocher Python support
  • Cocher GDB debugger version sur $LATESTGDBVERSION
  • System configuration
    • Cocher Passwords encoding sur MD5
    • Cocher Init system sur $DEVICEINITSYSTEM (ou BusyBox)
    • Cocher /dev management sur Dynamic using devtmpfs only
    • Cocher /bin/sh sur Busybox default shell
    • Cocher Install timezone info
  • Kernel
    • Définir Kernel version sur $DEVICEKERNELVERSION
    • Cocher Kernel binary format sur vmlinux
  • Target packages
    • Compressors and decompressors
      • bzip2 et xz-utils
    • Debugging profiling and benchmark
      • Cocher gdb et full debugger
    • Development tools
      • Ce dont vous aurez besoin
    • Filesystem and flash utilities
      • mtd, jffs2 and ubi/ubifs tools (ou ce dont vous aurez besoin)
    • Libraries
      • En général, ce dont vous avez besoin (suggestions ci-dessous)
      • Crypto
        • libsha1
        • libssh2
        • openssl
      • JSON/XML
        • expat
        • json-c
  • Networking applications
    • rsync et ce dont vous avez besoin
  • Shell and utilities
    • file
  • Filesystem images
    • ext2
  • Host 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 tools
    • host util-linux
  • N'oubliez pas d'ENREGISTRER
  • Memory technology device (MTD) support
    UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save
  • Pour sauvegarder la configuration du noyau dans notre arbre externe : make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
  • Pour sauvegarder la configuration uClibc dans notre arbre externe : make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig
  • BROCHERésistance GNDRésistance VCCVRemarques
    11kOhm1kOhm0V
    20Ohm90Ohm0VGND
    3INFOhm (multimètre 1)INFOhm (multimètre 1)2.1VHaute impédance, TDO ?
    490Ohm0Ohm3.3VVCC
    54.7kOhm4.7kOhm3.3V
    6INFOhm (multimètre 1)INFOhm (multimètre 1)0VNon connecté ?
    75.7kOhm5.7kOhm3.3V
    8INFOhm (multimètre 1)INFOhm (multimètre 1)0VNon connecté ?
    94.7kOhm4.7kOhm3.3V
    100Ohm90Ohm0VGND
    • Brochage compatible trouvé sur le site de test JTAG : Altera Byteblaster