Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Hardware Hacking Cheatsheet — Cheatsheet per Hardware Hacking | Kitploit
Strumenti/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
Sicurezza Sistemi EmbeddedSicurezza IoTSicurezza HardwareApprendimento e FormazioneRisorse CurateAnalisi del Firmware
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

Cheatsheet per Hardware Hacking

Vedi Repository
25 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Hardware Hacking Cheatsheet

[[TOC]]

Disclaimer

  • Sono un principiante che cerca di imparare questo tipo di cose, quindi potrebbe esserci qualcosa di non completamente corretto
  • Mi scuso per l'inglese

Note

  • Segui prima la metodologia del percorso più semplice
  • A volte dovrai saldare dei componenti; qui una guida rapida e semplice
    • Potresti dover saldare fili direttamente sui via del PCB (video)
      1. Incidi la superficie del PCB con un taglierino finché non vedi il bagliore sotto il solder mask
      2. Incidi nuovamente la superficie usando una matita di fibra di vetro
      3. Pulisci la superficie con alcool IPA e un cotton fioc
      4. Applica un po' di flussante
      5. Stagna il filo e salda
    • Note
      • Stagna sempre la punta del saldatore
      • Temperatura: 250-350 C
      • Non toccare il PCB con le mani

Raccolta informazioni e primo contatto

  1. Osserva l'etichetta sul retro del dispositivo e trova
    • Nome del modello
    • Numero di serie
    • L'azienda che ha marchiato il dispositivo (potrebbe non essere quella che lo ha costruito)
  2. Cerca su internet usando le informazioni appena raccolte
    • Migliori siti web contenenti informazioni
      • TechInfoDepot
      • OpenWRT
    • Cerca ..., di solito porta a molte informazioni
      • FCC ID (sito di riferimento)
      • Nome del SOC
      • Nome e quantità del chip flash
      • Nome e quantità del chip RAM
      • Altre possibili fonti di informazioni
  3. Apri il dispositivo
    • Cerca tutorial su come aprire il dispositivo
    • Alcuni dispositivi potrebbero essere incollati per impedire l'apertura, sii delicato
    • A volte ci sono dissipatori che coprono alcune parti del circuito, se possibile rimuovili
  4. Identifica i componenti
    • Per rendere i nomi dei circuiti più leggibili
      • Usa cotone + alcol, quando l'alcol è asciutto copri il circuito con del gesso, poi puliscilo; ora il nome del circuito dovrebbe essere leggibile
      • Usa una lente d'ingrandimento
    • Cerca informazioni e datasheet su internet su questi componenti; se non si trova nulla prova sui motori di ricerca cinesi
      • Baidu
      • Sogou
      • Haosou
    • IMPORTANTE: trovare un componente che ha VCC e GND ben esposti è molto utile
  5. Individua l'interfaccia UART: più o meno una TTY
    • Cerca su internet
    • Cerca sul PCB GND, IN o RX, OUT o TX e VCC
    • Cerca 3/4 pin sul PCB
      1. Trova un riferimento a GND
        • Usando componenti precedentemente trovati
        • Di solito le superfici metalliche sono a GND
      2. Trova un riferimento a VCC
        • Usando componenti precedentemente trovati
        • Cerca condensatori, di solito hanno un punto a VCC
      3. Testa i pin candidati UART compilando la tabella seguente (i punti elenco sono rispettivamente ogni colonna della tabella)
        1. Testa la resistenza dei pin UART rispetto a GND (multimetro su misura di resistenza, di solito )
  6. Connettiti tramite UART: usa un adattatore seriale (UART -> USB) per collegarti alla scheda tramite computer
    • Adattatore seriale scelto: FT232H + Focaccia Board
    1. Scegli la tensione appropriata (3.3V o 5V), altrimenti la scheda o l'adattatore seriale verranno danneggiati
    2. Collega RX della scheda a TX dell'adattatore e TX della scheda con RX dell'adattatore
      • NOTA: di solito non è necessario collegare il pin VCC
    3. Collega l'adattatore al computer
      1. sudo lsusb per localizzare l'adattatore
      2. ls -lart /dev per localizzare tutti i file di dispositivo; il nostro dovrebbe essere uno degli ultimi, di solito ttyUSB0
      3. Per accedere a questo dispositivo dobbiamo far parte del gruppo dialout (o essere ), per controllare i nostri gruppi
  7. Individua l'interfaccia JTAG
    • Cos'è JTAG: l'interfaccia JTAG offre ai produttori un modo per testare le connessioni fisiche tra i pin di un chip. Quando gli ingegneri elettronici parlano di usare JTAG per "fare debug" di un chip, si riferiscono a qualcosa di molto diverso dal debugging software tradizionale. Parlano di verificare che il pin A del chip A sia fisicamente connesso al pin B del chip B e che tutti quei pin funzionino correttamente. Poiché JTAG fornisce accesso hardware diretto a un dispositivo, è anche uno strumento fantastico per la ricerca sulla sicurezza.
    • Proprietà di JTAG
      • Controllabilità: impostare a 0 o 1 bit interni
      • Osservabilità: verificare il valore di bit interni
      • ...quindi lettura/scrittura di EEPROM
      • Debug in-circuit: eseguire debug del codice sul circuito (usando ad esempio OpenOCD e GDB)
    • Cerca su internet
    • Cerca sul PCB TCK, TDI, TDO, TMS e TRST (opzionale)
      • TCK (Test Clock): il "batterista" o metronomo che detta la velocità del controller. La tensione su questo pin semplicemente pulsa su e giù in un ritmo costante. Ad ogni "battito" del clock, il controller esegue una singola azione.
      • TMS (Test Mode Select): le tensioni sul pin Mode Select controllano quale azione JTAG esegue. Manipolando la tensione su questo pin, si dice a JTAG cosa si vuole che faccia.
  8. Collegati tramite JTAG: usa un "adattatore seriale" (JTAG -> USB) per connettere la scheda a un computer
    • Adattatore seriale scelto: FT232H + Focaccia Board
    1. Scegli la tensione appropriata (3.3V o 5V), altrimenti la scheda o l'adattatore seriale verranno danneggiati
    2. Usando il pinout JTAG trovato in precedenza, collega tutto insieme
    3. Mantieni aperta la connessione UART (come spiegato prima) per interagire con il dispositivo e osservare come si comporta
    4. Esegui OpenOCD
      • Prima finestra (server OpenOCD): openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE: Focaccia board reference
        • $BOARDCONFIGFILE: il file di configurazione della scheda che stai hacking (utile ma forse non ce l'hai, opzionale)
          • Note
            • I file di configurazione sono dentro /usr/local, forse qui potresti trovare qualche $BOARDCONFIGFILE utile
            • Altrimenti puoi cercare su internet
            • Altrimenti puoi scriverlo tu stesso
            • TODO (scrivilo tu stesso)
      • Seconda finestra (client OpenOCD): telnet localhost 4444
  9. Ottieni il firmware e il filesystem
    • Possibilità (firmware e filesystem potrebbero essere crittografati)
      • Scaricalo dal sito del produttore
      • Se solo il dispositivo può scaricare il firmware (tramite un aggiornamento), sniffa la rete con wireshark per raccogliere informazioni
      • Leggendo l'EEPROM direttamente con un programmatore di chip flash e un test clip
      • Comando di dump del bootloader
        1. Analizza il log di boot stampato sull'interfaccia UART
          • Informazioni che potrebbero essere stampate e che ci interessano (i valori sono esempi ma sono esplicativi di ciò che cerchiamo)
            • Informazioni generali sul bootloader
              • Cerca nome e versione del bootloader (es: U-Boot 1.1.3)
            • Informazioni SOC
              • Informazioni aggiuntive sulle schede (wifi, ethernet...), potrebbero montare il proprio bootloader
              • Modello SOC (es: ASIC MT7621A...)
              • Frequenza CPU
            • Informazioni RAM
              • mtd->writesize=2048: dimensione pagina (byte)
              • mtd->oobsize=64: dati usati per la correzione errori (byte)
              • devinfo.iowidth=8: dati scritti/letti per operazione (byte)
              • Quantità di RAM
            • Informazioni EEPROM
              • mtd->erasesize=131072: scritture rimanenti dell'EEPROM? (più o meno)
            • Informazioni kernel OS
              • Cerca informazioni sul caricamento del bootloader, qui puoi trovare informazioni sul filesystem
              • Cerca la versione di buildroot, questo ci aiuterà ad emulare il circuito e fare vari test

TODO SPI DUMP

TODO GDB ATTACH????

Reverse engineering

  1. Tipo di processo init e file di configurazione
    • Tipi
      • Stile BSD
        • Inizia eseguendo script in
          • /etc/rc
          • /etc/rc.local
        • Più recenti
          • Vedi in /etc/rc.conf per informazioni
          • Esegui /etc/rc.d/
      • System V (più popolare)
        • Viene avviato BusyBox
        • I file di configurazione sono in /etc/inittab
          • runlevel
            • 1: modalità utente singolo, shell root, nessuna password, nessun demone in esecuzione
            • 3: modalità multituente testuale, prompt di login
            • 5: login grafico
          • Poi c'è un elenco di azioni eseguite all'init
        • Esegui /etc/init.d/
      • Systemd (non usato negli embedded)
    • Come identificarlo
      • Stampato all'avvio
      • Analizza cercando informazioni (sopra) per identificare i tipi

Ambiente di emulazione

  • Requisiti
    • Conoscere l'architettura CPU del file binario
      • Banale usando il comando file
    • QEMU deve supportare questa architettura
  • Emulazione QEMU (modalità)
    • Modalità sistema: emula l'intero sistema
      • Come fare
        1. Individua il formato eseguibile di QEMU: qemu-system-$PROCESSOR$ARCHITECTURE

          • Esempio: qemu-system-mipsel
        2. Se conosci la famiglia del processore, puoi specificarla per aiutare QEMU a emulare meglio l'ambiente

          • Per ottenere un elenco delle famiglie supportate: $QEMUBIN -cpu help
          • È sempre meglio iniziare con una CPU di famiglia generale, poi se qualcosa non funziona prova a scavare più a fondo e usa famiglie CPU specifiche
        3. Abbiamo bisogno di kernel e filesystem root

          • Note
            • Il kernel del dispositivo non è buono per driver mancanti
            • Non c'è standardizzazione nel mondo IoT
              • Usa il device tree del kernel: file di testo che definisce i driver della scheda
                • Il kernel all'avvio caricherà questo file e adatterà i driver generici alla scheda in uso
                • Non molto usato
            • QUINDI.. RICOSTRUISCI IL KERNEL E IL FILESYSTEM
          1. Trova la versione del kernel, la versione di libc e l'elenco delle librerie usate dall'eseguibile che ci interessa (readelf -d $EXECUTABLE)

            • Formato versione libreria: ( è la versione)
root@kitploit:~
                    mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
                    ```
                    1. Identificare i byte per il modulo kernel
                        - Durante l'avvio di solito vengono stampate informazioni sulla NAND, guardarle (passaggi sopra) e cercare `NAND ID`, i byte stampati sono in ordine primo, secondo e quarto byte
                        - Possiamo trovare queste informazioni anche cercando nel datasheet della EEPROM
                        - Possiamo anche usare `writesize, oobsize, erasesize, iowidth` per trovare [qui](http://www.linux-mtd.infradead.org/faq/nand.html#L_nand_nandsim) il comando corretto
                        - Altrimenti, tentativi ed errori
                    2. Analizzare le partizioni della EEPROM stampate all'avvio per trovare le loro dimensioni e nomi, l'ultimo numero nel comando `flash_erase` è la loro dimensione correlata a `erasesize` (uguale a `parts=x,y,z,...`)
                    3. Caricare le partizioni estratte dal dispositivo in quelle appena create
                    4. Creare un mountpoint per il filesystem e allegare
                        - `-O`: specificare l'offset dell'header del volume ID, se sbagliato il sistema dovrebbe comunque dirti il valore giusto; puoi provare valori diversi come `512, 1024, 2048` (tentativi ed errori)
                        - `-m`: numero del dispositivo `mtd` (vedi punto 3)
                        - `-d`: numero del dispositivo UBI (vedi punto 5)
                    5. Montare
    - Modalità utente: come wine, esegue solo un binario e lo "traduce" per la nostra architettura
        - Note
            - Non molto stabile
            - Può dare risultati strani
        - Come fare
            1. Individuare il formato eseguibile di QEMU: `qemu-$PROCESSORE$ARCHITETTURA`
                - Esempio: `qemu-mips64`
            2. Se QEMU lamenta l'assenza dell'interprete, passare il percorso della **CARTELLA CHE CONTIENE** questo interprete con `-L` (o vedere `man`)
                - Per sapere quale interprete viene utilizzato da un eseguibile, usare `readelf -l $ESEGUIBILE`
    - Modalità virtualizzazione: non interessante per noi
- Costruzione del kernel e del filesystem root usando buildroot e docker
    - Il nostro kernel costruito dovrebbe avere (rispetto al kernel originale)
        - Stessa versione del kernel
        - Stessa versione di libc (`uClibc, uClibc-ng, musl, dietlibc...`)
        - Stesse versioni delle librerie (dell'eseguibile che ci interessa)
    1. Cercare la versione di buildroot più vicina alle versioni del nostro dispositivo
        - A volte durante l'avvio/esplorazione della memoria scansionata possiamo trovare la versione di buildroot utilizzata (se il dispositivo è stato costruito con buildroot)
    2. Trovare una versione di linux compatibile con la versione di buildroot trovata e creare un container docker, [qui](https://github.com/digiampietro/hacking-gemtek/blob/master/docker/Dockerfile) un esempio di dockerfile (i pacchetti sono importanti per eseguire buildroot)
    3. Scaricare la versione di buildroot selezionata da [qui](https://buildroot.org/downloads/) e metterla nella cartella condivisa del container docker
    4. Eseguire e passare al container docker
    5. Estrarre buildroot e `make manual` per creare il manuale di buildroot
    6. Usare `make help` per stampare tutti i dispositivi (board) supportati da buildroot; `make $NOMEBOARD` per creare un file di configurazione buildroot della tua board
    7. `make menuconfig` (testuale) o `make xconfig` (GUI) per selezionare i moduli del kernel da aggiungere alla nostra build, useremo `make xconfig`
        - Qui c'è un esempio/linea guida ma dovrai scoprire da solo quali moduli in particolare ti serviranno per eseguire le tue applicazioni
        - Trucco: `Edit->Find` per cercare moduli
        - Opzioni
            - `Target options`
                - Spuntare `Show options and packages that are deprecated or obsolete`
                - Spuntare `Build packages with debugging symbols` con il `debug level` più alto
                - Spuntare `Strip command for binaries on target` a `None`
                - Spuntare `GCC optimization level` a `0`
            - `Toolchain`
                - Spuntare `Toolchain type` a `Buildroot toolchain`
                - Spuntare `Kernel headers` a `Manually specified linux version`
                - Spuntare `Custom kernel headers series` a `$VERSIONEKERNELDISPOSITIVO`
                - Impostare `Linux version` a `$VERSIONEKERNELDISPOSITIVO`
                - Spuntare `C library` a `$LIBRERIACDISPOSITIVO`
                - Spuntare `$LIBRERIACDISPOSITIVO version` a `$LIBRERIACDISPOSITIVO $VERSIONELIBRERIADISPOSITIVO`
                - Spuntare `Enable large files`
                - Spuntare `Enable IPv6`
                - Spuntare `Enable RPC`
                - Spuntare `Enable WCHAR`
                - Spuntare `Thread library implementation` a `linuxthreads`
                - Spuntare `Thread library debugging`
                - Spuntare `Build cross gdb for the host`
                - Spuntare `TUI support`
                - Spuntare `Python support`
                - Spuntare `GDB debugger version` a `$ULTIMAVERSIONEGDB`
            - `System configuration`
                - Spuntare `Passwords encoding` a `MD5`
                - Spuntare `Init system` a `$SISTEMAINITDISPOSITIVO` (o `BusyBox`)
                - Spuntare `/dev management` a `Dynamic using devtmpfs only`
                - Spuntare `/bin/sh` a `Busybox default shell`
                - Spuntare `Install timezone info`
            - `Kernel`
                - Impostare `Kernel version` a `$VERSIONEKERNELDISPOSITIVO`
                - Spuntare `Kernel binary format` a `vmlinux`
            - `Target packages`
                - `Compressors and decompressors`
                    - `bzip2` e `xz-utils`
                - `Debugging profiling and benchmark`
                    - Spuntare `gdb` e `full debugger`
                - `Development tools`
                    - Quello che ti serve
                - `Filesystem and flash utilities`
                    - `mtd, jffs2 and ubi/ubifs tools` (o quello che ti serve)
                - `Libraries`
                    - In generale quello che ti serve (suggerimenti sotto)
                    - `Crypto`
                        - `libsha1`
                        - `libssh2`
                        - `openssl`
                    - `JSON/XML`
                        - `expat`
                        - `json-c`
            - `Networking applications`
                - `rsync` e quello che ti serve
            - `Shell and utilities`
                - `file`
            - `Filesystem images`
                - `ext2`
            - `Host utilities` (non riguarda il dispositivo target, qui parliamo del dispositivo host)
                - `host mtd, jffs2 and ubi/ubifs tools`
                - `host util-linux`
        - Ricordarsi di SALVARE
    8. Per salvare permanentemente la configurazione appena definita usare `make savedconfig`
    9. Configurare il kernel con `make linux-menuconfig` (testuale) o `make linux-xconfig` (GUI), qui useremo la versione CLI
        - Qui c'è un esempio/linea guida ma dovrai scoprire da solo quali moduli in particolare ti serviranno per eseguire le tue applicazioni
        - Opzioni
            - `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` -> `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`
    10. Configurare `uClibc` (o la tua libreria c) usando `uclibc-menuconfig` (come sempre)
        - Abilitare il debugging: `Development/Debugging options` -> `Enable debugging symbols`, se non funziona (errori di compilazione) allora `Development/Debugging options` -> `(Wall) compiler warnings` -> aggiungere `-Wall -ggdb -g3`
            - `-ggdb`: fornisce informazioni di debug per l'uso con GDB
            - `-g3`: fornisce informazioni di debug extra
        - `Save`
        - Abilitare le funzionalità come nel nostro dispositivo (tentativi ed errori, se ottieni errori investiga e poi ricostruisci con le funzionalità necessarie)
    11. `make`, se ci sono problemi tornare indietro
        - Possibili errori di compilazione
            - `Need to use -fPIC`
                - Aggiungere `--enable-shared` nei moduli del kernel (punto 7) sotto `Toolchain` -> `Additional gcc options` o patchare buildroot
    - Salvare i file di configurazione per buildroot con git
        - Struttura dell'albero esterno (tree view dei file da comprendere per buildroot) (`br2`)
            ```
            +-- board/
            |   +-- <company>/ (non sempre usato)
            |       +-- <boardname>/
            |           +-- linux.config
            |           +-- busybox.config
            |           +-- kernel-defconfig (file di configurazione del kernel)
            |           +-- <altri file di configurazione>
            |           +-- post_build.sh (eseguito appena prima di costruire l'immagine, utile per copiare il filesystem root nell'immagine)
            |           +-- post_image.sh
            |           +-- rootfs_overlay/ (tutto qui verrà copiato nell'immagine finale)
            |           |   +-- etc/
            |           |   +-- <qualche file>
            |           +-- patches/
            |               +-- foo/
            |               |   +-- <qualche patch>
            |               +-- libbar/
            |                   +-- <altre patch>
            |
            +-- configs/
            |   +-- <boardname>_defconfig (configurazione buildroot per la nostra board)
            |   +-- uClibc.config (opzionale)
            +-- patches/
            |   +-- (qui patch da applicare)
            |
            +-- Config.in (se si utilizza un albero br2-external)
            +-- external.mk (se si utilizza un albero br2-external)
            +-- external.desc (se si utilizza un albero br2-external)
            ```
        - Per utilizzare un albero esterno, invocare buildroot in questo modo: `make BR2_EXTERNAL=$PERCORSOALBEROESTERNO $COMANDO`
        - Per salvare la configurazione buildroot nel nostro albero esterno: `make BR2_EXTERNAL=$PERCORSOALBEROESTERNO savedefconfig`
        - Per salvare la configurazione del kernel nel nostro albero esterno: `make BR2_EXTERNAL=$PERCORSOALBEROESTERNO linux-update-defconfig`
        - Per salvare la configurazione uClibc nel nostro albero esterno: `make BR2_EXTERNAL=$PERCORSOALBEROESTERNO BR2_UCLIBC_CONFIG=$PERCORSO DOVE SALVARE LA CONFIGURAZIONE UCLIBC uclibc-update-defconfig`

## Fonti, crediti e ringraziamenti

- Grazie a [Valerio Di Giampietro](https://va.ler.io/) ([@valerio](https://twitter.com/valerio)) per il suo incredibile canale youtube [tutorial](https://www.youtube.com/channel/UCoyNuc5bJ-z4X-6OlpNtJUw) sull'hardware hacking, tutto ciò che è scritto qui è al massimo preso da questi video.
- Grazie a [Luca Bongiorni](https://lockpicking.club/) ([@LucaBongiorni](https://twitter.com/LucaBongiorni)) per i suoi preziosi consigli e strumenti hardware.
- Grazie a mightyohm.com per [Soldering comics](https://mightyohm.com/files/soldercomic/FullSolderComic_EN.pdf)
- Grazie alla community di Reddit [hardwarehacking](https://www.reddit.com/r/hardwarehacking) per avermi aiutato
    - [[Noob] Direct PCB soldering (maybe?)](https://www.reddit.com/r/hardwarehacking/comments/lrbtaa/noob_direct_pcb_soldering_maybe/?utm_medium=android_app&utm_source=share)
- Grazie a [Andrew Paul](https://www.youtube.com/channel/UCtfcWatnWeEY_vq_UOL4PDQ) per il tutorial sulla saldatura di vias
- [Manuale di Buildroot](https://buildroot.org/downloads/manual/manual.html)
- [JTAG spiegato](https://blog.senr.io/blog/jtag-explained)
- [OpenOCD - Comandi Flash](http://openocd.org/doc/html/Flash-Commands.html)
- [Informazioni su OpenOCD + JTAG](https://www.allaboutcircuits.com/technical-articles/getting-started-with-openocd-using-ft2232h-adapter-for-swd-debugging/)
- [Hardware hacking cheat sheet - Piccolo PDF](https://github.com/arunmagesh/hw_hacking_cheatsheet/blob/master/cheatsheet_0.1.pdf)
- [OpenOCD](http://openocd.org/)
Scarica lo strumento
200k
  • Testa la resistenza dei pin UART rispetto a VCC (multimetro su misura di resistenza, di solito 200kOhm)
  • Accendi il dispositivo e testa la tensione dei pin UART rispetto a GND (multimetro su misura di tensione, di solito 20V)
  • Accendi il dispositivo e DURANTE L'AVVIO testa la tensione del pin TX sospetto rispetto a GND (multimetro su misura di tensione, di solito 20V); se la tensione oscilla allora questo pin è probabilmente TX (perché sta inviando dati)
  • Accendi il dispositivo e DURANTE L'AVVIO testa la tensione del pin RX sospetto rispetto a GND (multimetro su misura di tensione, di solito 20V); se la tensione rimane a 0 allora questo pin è probabilmente RX (perché sta aspettando di ricevere dati)
    • Tabella

      PINResistenza GNDResistenza VCCVNote
      1
      2
      3
      4
      • Esempio

  • Usa Jtagulator
    1. Collegalo al computer (baud rate: 115200)
    2. IMPORTANTE: H è la funzione di aiuto stampa, usala ovunque
    3. Collega GND della scheda a GND del Jtagulator, pin della scheda 1,2,3 ai canali 1,2,3 del Jtagulator
    4. V: imposta la tensione di lavoro
    5. U: entra nel menu di identificazione UART
    6. U: avvia l'identificazione
    7. Text string to output: default
    8. Starting channel: canale dove hai messo il pin 1 della scheda
    9. Ending channel: canale dove hai messo il pin 3 della scheda
    10. Ignore non-printable characters: Sì
    11. Fatto!
  • TODO: - Usare BurtleinaBoard + Busside
  • root
    groups $USER
  • screen /dev/ttyUSB0 $BAUDRATE per connettersi alla TTY
    • $BAUDRATE può essere uno di quelli trovati qui
    • $BAUDRATE più comuni
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • IMPORTANTE: se sbagliamo $BAUDRATE potremmo vedere caratteri illeggibili o anche NULLA
    • ctrl + a -> k -> y: chiudi screen
    • Se il pin RX sembra non funzionare (scrivi e premi invio ma non succede nulla) potrebbe essere che il valore di "invio" è sbagliato: \r\n o \n?
      • Per risolvere usa pyserial, la libreria python per comunicazione seriale, esempio:
        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")
        
      • Se il problema persiste usa un logic analyzer (qui uno economico)
  • TDI (Test Data-In): il pin che immette dati nel chip. Lo standard JTAG non definisce protocolli per la comunicazione su questo pin. Questo è lasciato al produttore. Dal punto di vista di JTAG, questo pin è semplicemente un metodo di ingresso per 1 e 0 nel chip. Cosa il chip faccia con essi è irrilevante per JTAG.
  • TDO (Test Data-Out): il pin per i dati in uscita dal chip. Come il pin Data-In, i protocolli di comunicazione non sono definiti da JTAG.
  • TRST (Test Reset, opzionale): questo segnale viene utilizzato per resettare JTAG a uno stato noto e buono.
  • Cerca una fila di 5/6 pin o una doppia fila di 10, 12, 14, 20 pin sul PCB
    1. Trova un riferimento a GND
      • Usando componenti precedentemente trovati
      • Di solito le superfici metalliche sono a GND
    2. Trova un riferimento a VCC
      • Usando componenti precedentemente trovati
      • Cerca condensatori, di solito hanno un punto a VCC
    3. Testa i pin candidati JTAG compilando la tabella seguente (i punti elenco sono rispettivamente ogni colonna della tabella)
      1. Testa la resistenza dei pin JTAG rispetto a GND (multimetro su misura di resistenza, di solito 200k)
      2. Testa la resistenza dei pin JTAG rispetto a VCC (multimetro su misura di resistenza, di solito 200kOhm)
      3. Accendi il dispositivo e testa la tensione dei pin JTAG rispetto a GND (multimetro su misura di tensione, di solito 20V)
      • Tabella

    4. Confronta i valori trovati con i pinout JTAG più usati, disponibili su jtagtest
  • Usa Jtagulator
    1. Collegalo al computer (baud rate: 115200)
    2. IMPORTANTE: H è la funzione di aiuto, usala ovunque
    3. Collega il GND della scheda al GND dello Jtagulator, i pin della scheda 1,2,3... ai canali dello Jtagulator 1,2,3...
    4. V: imposta la tensione di lavoro
    5. J: entra nel menu di identificazione JTAG
    6. Qui abbiamo due opzioni
      • I: identifica con scansione IDCODE, non troverà TDI (veloce), meglio se ho molti pin da identificare
      • B: identifica con scansione BYPASS, troverà TDI (lento), meglio se ho pochi pin da identificare
    7. Starting channel: canale dove mettiamo il pin 1 della scheda
    8. Ending channel: canale dove mettiamo il pin n della scheda
    9. Already known pins: No, ma potrebbe accelerare il processo se conosciamo già alcuni pin
    10. Avvia e attendi.. Fatto!
  • TODO: - Usa BurtleinaBoard + Busside
  • IMPORTANTE
    • Il JTAG potrebbe essere stato disabilitato (hardware, rimuovendo un resistore), quindi è possibile che ciò che trovi con il multimetro e Jtagulator non sia coerente; possiamo risolvere mettendo un resistore di circa 300Ohm o 1kOhm tra questo pin e VCC
    • Il JTAG potrebbe essere stato disabilitato (hardware, rimuovendo un resistore); questo problema può essere risolto rimettendo il resistore o facendo una connessione diretta cortocircuitando i pad del resistore
    • Il JTAG potrebbe essere stato disabilitato (software, impostando alcuni valori)
    • Il JTAG potrebbe essere stato disabilitato (hardware, bruciando un fusibile... in questo caso non c'è speranza)
    • Comandi utili
      • halt: ferma la CPU (come congelare)
        • DEVE ESSERE FATTO PRIMA DI OGNI OPERAZIONE DI DEBUG
      • reset: resetta la CPU
      • reg: legge i registri della CPU
      • flash info bank $BANKID o flash info $BANKID: stampa informazioni sul banco di memoria flash $BANKID (penso che banchi = chunk di memoria)
      • flash list: recupera un elenco di array associativi per ogni dispositivo dichiarato con flash bank (in $BOARDCONFIGFILE), numerati da zero
      • flash banks: stampa un riepilogo di una riga per ogni dispositivo dichiarato con flash bank (in $BOARDCONFIGFILE), numerati da zero
      • flash write_image erase "$BINTOWRITE" $ADDRTOSTART: scrittura della memoria flash
        • $BINTOWRITE: può essere bin (binario), ihex (Intel hex), elf (file ELF), s19 (Motorola s19), mem...
        • $ADDRTOSTART: indirizzo da cui iniziare a scrivere (penso che il default sia 0)
      • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: dump della memoria
        • $OUTFILE: file binario dove salvare il dump
        • $ADDRTOSTART: indirizzo da cui iniziare a leggere (penso che il default sia 0)
        • $SIZETODUMP: numero di byte da dumpare
    • Altro qui:
      • OpenOCD PDF
      • OpenOCD HTML
    • TODO
  • Informazioni filesystem
    • Cerca informazioni sul caricamento del bootloader e sul processo di avvio dell'OS, qui puoi trovare informazioni sul filesystem
  • Partizioni EEPROM
    • Cerca il processo di avvio dell'OS, qui puoi trovare informazioni sulle partizioni dell'EEPROM, i loro nomi, punti di mount e lunghezza in RAM
    • Se vedi partizioni duplicate, probabilmente è per aggiornamenti firmware, puoi immaginare perché
  • Informazioni sul processo init
    • Cerca init started o qualcosa di simile, probabilmente sarà vicino alla stringa BusyBox o qualcosa di analogo
  • Il bootloader ha una CLI?
    • Cerca il menu del bootloader, qui probabilmente troveremo la risposta a questa domanda
  • Prova ad ottenere una shell del bootloader (automaticamente o tramite un menu stampato via UART)
  • Esplora la shell del bootloader
    • Il comando help è tuo amico
    • Prova a trovare un modo per fare dump del contenuto della memoria, python è tuo amico
    • I dati OOB (correzione errori) non sono così utili da dumpare
  • Analisi dei dati dumpati
    • Usa binwalk, file e hexdump -C per verificare se il file dumpato è ok o no e se è compresso o crittografato
      • Con binwalk -E analizziamo l'entropia del file
        • Entropia VICINA a 1: file casuale, compresso o crittografato
        • Entropia SOTTO 1: eseguibile o file normale
    • Usa binwalk -e per estrarre segmenti identificabili del file
  • Se binwalk non capisce completamente l'immagine dumpata, possiamo usare la tabella delle partizioni dell'EEPROM (se trovata in precedenza) per suddividere manualmente l'immagine dumpata in più immagini utili
    • 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 o binwalk -W -i per confrontare immagini (se per esempio pensiamo possano essere la stessa immagine)
  • L'ultima operazione potrebbe essere eseguita più volte a seconda di ciò che contiene l'immagine dumpata; se per esempio abbiamo l'immagine del kernel possiamo estrarre i suoi componenti un'altra volta con binwalk (o dd se possiamo trovare online come è strutturata la nostra immagine kernel specifica) per leggere il filesystem root
  • Estrai il filesystem
    • Comando di esempio (basato sul tipo di filesystem): fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot: crea un ambiente root fittizio, utile per emulare permessi file, file di dispositivo...
        • -s fakeroot.dat: salva l'ambiente root fittizio per ripristinarlo successivamente con il comando fakeroot -i fakeroot.dat bash
      • usquashfs: estrae il filesystem squashfs (potrebbe essere diverso nel tuo caso)
        • -d squashfs-root: cartella di destinazione
        • u04-sqfs.dat: immagine del filesystem da estrarre
  • /sbin/init
  • Binari e script interessanti
    • Cerca file interessanti avviati dal processo init e in generale non fermarti ai nomi, guarda in profondità quale binario viene eseguito e analizzali; i più interessanti sono quelli non standard
    • Cerca la stringa factory mode; se riusciamo a mettere il dispositivo in modalità factory (se esiste), allora hackerarlo è molto più facile
    • Comandi utili
      • Editor di testo
      • grep
      • find
      • xargs
      • strings
  • libfoo.X.Y.Z
    X.Y.Z
    • X ABI incompatibile
    • Y ABI retrocompatibile
    • Z nessun cambiamento ABI
  • Quindi abbiamo bisogno di X.Y uguale alla libreria originale
    • Accettabile: stesso X, Y superiore
  • Costruisci usando un sistema di build (seleziona funzionalità e tracciamento automatico delle dipendenze)

    • Migliori scelte di sistema di build
      • The Yocto project
      • Buildroot (migliore)
      • Sistema di build OpenWRT
  • Inizia l'emulazione

    • Script di emulazione 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
      
    • Se durante l'esecuzione di un binario viene stampato un errore riguardante librerie mancanti, imposta LD_LIBRARY_PATH come segue (all'interno della macchina): export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • Potremmo anche emulare la NAND EEPROM
      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
      
  • PINResistenza GNDResistenza VCCVNote
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V all'avvio - TX
    3INFOhm (multimetro 1)INFOhm (multimetro 1)3.3V0V all'avvio - RX
    40Ohm30kOhm0VGND
    PINResistenza GNDResistenza VCCVNote
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • Esempio

      PINResistenza GNDResistenza VCCVNote
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (multimetro 1)INFOhm (multimetro 1)2.1VAlta impedenza, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (multimetro 1)INFOhm (multimetro 1)0VNon connesso?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (multimetro 1)INFOhm (multimetro 1)0VNon connesso?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • Trovato pinout compatibile con il test site JTAG: Altera Byteblaster