
Hardware Hacking Cheatsheet
[[TOC]]
250-350 CVCC e GND bem expostos é muito útilGND, IN ou RX, OUT ou TX e VCC3/4 pinos na PCB
GND
GNDVCC
VCCGND (multímetro na medição de resistência, geralmente )3.3V ou 5V), caso contrário a placa ou o adaptador serial será danificadoRX da placa ao TX do adaptador e o TX da placa ao RX do adaptador
VCCsudo lsusb para localizar o adaptadorls -lart /dev para localizar todos os arquivos de dispositivo; o nosso deve ser um dos últimos, geralmente ttyUSB0dialout (ou ser ); para verificar nossos grupos, use 0 ou 1TCK, TDI, TDO, TMS e TRST (opcional)
TCK (Test Clock): o baterista, ou metrônomo, que dita a velocidade do controlador. A tensão neste pino simplesmente pulsa para cima e para baixo em uma batida rítmica e constante. A cada "batida" do clock, o controlador executa uma única ação.TMS (Test Mode Select): as tensões no pino Mode Select controlam qual ação o JTAG executa. Ao manipular a tensão neste pino, você diz ao JTAG o que deseja que ele faça.3.3V ou 5V), caso contrário a placa ou o adaptador serial serão danificadosopenocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE: referência da placa Focaccia$BOARDCONFIGFILE: arquivo de configuração da placa que você está hackeando (útil, mas talvez você não o tenha; opcional)
/usr/local, talvez aqui você possa encontrar algum $BOARDCONFIGFILE útilU-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048: tamanho da página (bytes)mtd->oobsize=64: dados usados para correção de erros (bytes)devinfo.iowidth=8: dados gravados/lidos por operação (bytes)mtd->erasesize=131072: gravações restantes da EEPROM? (mais ou menos)TODO SPI DUMP
TODO GDB ATTACH????
/etc/rc/etc/rc.local/etc/rc.conf para informações/etc/rc.d//etc/inittab
runlevel
1: modo usuário único, shell root, sem senha, nenhum daemon em execução3: modo multiusuário baseado em texto, prompt de login5: login gráfico/etc/init.d//sbin/init procurando por informações (acima) que identifiquem os tiposfileLocalize o formato do executável do QEMU: qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipselSe você conhece a família do processador, pode especificá-la para ajudar o QEMU a emular melhor o ambiente
$QEMUBIN -cpu helpPrecisamos do kernel e do sistema de arquivos raiz
Encontre a versão do kernel, a versão da libc e a lista de bibliotecas usadas pelo executável que nos interessa (readelf -d $EXECUTABLE)
200kVCC (multímetro na medição de resistência, geralmente 200kOhm)GND (multímetro na medição de tensão, geralmente 20V)TX em relação a GND (multímetro na medição de tensão, geralmente 20V); se a tensão estiver oscilando, então este pino é provavelmente TX (porque está enviando dados)RX em relação a GND (multímetro na medição de tensão, geralmente 20V); se a tensão estiver presa em 0, então este pino é provavelmente RX (porque está esperando receber dados)Tabela
| PIN | Resistência a GND | Resistência a VCC | V | Notas |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Exemplo
115200)H é a função que imprime a ajuda, use-a em qualquer lugarGND da placa ao GND do Jtagulator, os pinos 1,2,3 da placa aos canais 1,2,3 do JtagulatorV: define a tensão de trabalhoU: entra no menu de identificação UARTU: inicia a identificaçãoText string to output: defaultStarting channel: canal onde colocamos o pino 1 da placaEnding channel: canal onde colocamos o pino 3 da placaIgnore non-printable characters: Yesrootgroups $USERscreen /dev/ttyUSB0 $BAUDRATE para se conectar ao TTY
$BAUDRATE pode ser um dos encontrados aqui$BAUDRATE mais comuns
1152009600576003840019200$BAUDRATE, podemos ver caracteres estranhos ou até NADActrl + a -> k -> y: fechar o screen\r\n ou \n?
pyserial, a biblioteca do python para comunicação serial, exemplo:
#!/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")
TDI (Test Data-In): o pino que alimenta dados no chip. O padrão JTAG não define protocolos para comunicação por este pino. Isso fica a cargo do fabricante. No que diz respeito ao JTAG, este pino é simplesmente um método de entrada para 1s e 0s entrarem no chip. O que o chip faz com eles é irrelevante para o JTAG.TDO (Test Data-Out): o pino para dados que saem do chip. Assim como o pino Data-In, os protocolos de comunicação não são definidos pelo JTAG.TRST (Test Reset, opcional): este sinal é usado para redefinir o JTAG para um estado bom conhecido.5/6 pinos ou uma fileira dupla de 10, 12, 14, 20 pinos na PCB
GND
GNDVCC
VCCGND (multímetro na medição de resistência, geralmente 200k)VCC (multímetro na medição de resistência, geralmente 200kOhm)GND (multímetro na medição de tensão, geralmente 20V)Tabela
115200)H é a função que imprime ajuda, use-a em todo lugarGND da placa ao GND do Jtagulator, os pinos 1,2,3... da placa aos canais 1,2,3... do JtagulatorV: define a tensão de trabalhoJ: entra no menu de identificação JTAGI: identificar com varredura IDCODE, não encontrará TDI (rápido), melhor se eu tiver muitos pinos para identificarB: identificar com varredura BYPASS, encontrará TDI (lento), melhor se eu tiver menos pinos para identificarStarting channel: canal onde colocamos o pino 1 da placaEnding channel: canal onde colocamos o pino n da placaAlready known pins: Não, mas poderia acelerar o processo se já soubermos alguns pinos300Ohm ou 1kOhm entre esse pino e o VCCtelnet localhost 4444halt: pausa a CPU (como congelar)
reset: reinicia a CPUreg: lê os registradores da CPUflash info bank $BANKID ou flash info $BANKID: imprime informações sobre o banco de memória flash $BANKID (acho que bancos = pedaço de memória)flash list: recupera uma lista de arrays associativos para cada dispositivo declarado usando flash bank (em $BOARDCONFIGFILE), numerados a partir de zeroflash banks: imprime um resumo de uma linha para cada dispositivo declarado usando flash bank (em $BOARDCONFIGFILE), numerados a partir de zeroflash write_image erase "$BINTOWRITE" $ADDRTOSTART: grava na memória flash
$BINTOWRITE: pode ser bin (binário), ihex (Intel hex), elf (arquivo ELF), s19 (Motorola s19), mem...$ADDRTOSTART: endereço onde começar a escrever (acho que o padrão é 0)flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: despeja a memória
$OUTFILE: arquivo binário onde salvar o dump$ADDRTOSTART: endereço onde começar a ler (acho que o padrão é 0)$SIZETODUMP: número de bytes para despejarinit started ou algo parecido; isso provavelmente estará perto da string BusyBox ou algo análogohelp é seu amigobinwalk, file e hexdump -C para verificar se o arquivo despejado está ok ou não e se está compactado ou criptografado
binwalk -E analisamos a entropia do arquivo
1: arquivo aleatório, compactado ou criptografado1: executável ou arquivo normalbinwalk -e para extrair segmentos identificáveis do arquivobinwalk não entender completamente a imagem despejada, podemos usar a tabela de partições da EEPROM (se encontrada anteriormente) para dividir manualmente a imagem despejada em várias imagens úteis
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 para comparar imagens (se, por exemplo, acharmos que podem ser a mesma imagem)binwalk (ou dd, se pudermos encontrar online como nossa imagem de kernel específica é estruturada) para ler o sistema de arquivos raizfakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
fakeroot: cria um ambiente root falso, útil para emular permissões de arquivo, device files...
-s fakeroot.dat: salva o ambiente root falso para restaurar depois com o comando fakeroot -i fakeroot.dat bashusquashfs: extrai o sistema de arquivos squashfs (pode ser diferente no seu caso)
-d squashfs-root: pasta de destinou04-sqfs.dat: imagem do sistema de arquivos a extrairfactory mode; se conseguirmos colocar o dispositivo no modo de fábrica (se existir), hackeá-lo fica muito mais fácilgrepfindxargsstringslibfoo.X.Y.ZX.Y.ZX ABI incompatívelY ABI compatível com versões anterioresZ sem mudanças de ABIX.Y igual ao da biblioteca original
X, Y maiorCompile usando um sistema de build (selecione recursos e rastreie dependências automaticamente)
Comece a emular
#!/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 da seguinte forma (dentro da máquina): 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
```# Parte 5: Montagem
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND ID; os bytes impressos estão na ordem: primeiro, segundo e quarto bytewritesize, oobsize, erasesize, iowidth para encontrar aqui o comando corretoflash_erase é o tamanho delas correlacionado ao erasesize (mesmo que parts=x,y,z,...)-O: especifica o offset do cabeçalho do volume id; se estiver errado, o sistema deve informar o valor correto; mesmo assim, você pode tentar valores diferentes como 512, 1024, 2048 (tentativa e erro)-m: número do dispositivo mtd (veja o ponto 3)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L (ou veja man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)make manual para criar o manual do buildrootmake help, o buildroot exibe todos os dispositivos suportados (placas); use make $YOURBOARDNAME para criar um arquivo de configuração do buildroot para a sua placamake menuconfig (baseado em texto) ou make xconfig (GUI) para selecionar os módulos do kernel a serem adicionados à nossa compilação; usaremos make xconfig
Edit->Find para pesquisar módulosTarget options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols com o maior debug levelStrip command for binaries on target para NoneGCC optimization level para 0Toolchain
Toolchain type para Buildroot toolchainmake savedconfigmake linux-menuconfig (baseado em texto) ou make linux-xconfig (GUI); aqui usaremos a versão 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 sua biblioteca C) usando uclibc-menuconfig (como sempre)
Development/Debugging options -> Enable debugging symbols; se isso não funcionar (erros de compilação), então Development/Debugging options -> (Wall) compiler warnings -> adicione -Wall -ggdb -g3
-ggdb: fornece informações de depuração para usar com o GDB-g3: fornece informações de depuração adicionaisSavemake; se houver problemas, volte e itere
Need to use -fPIC
--enable-shared nos módulos do kernel (ponto 7) em Toolchain -> Additional gcc options ou aplique um patch no 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 | Resistência a GND | Resistência a VCC | V | Notas |
|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V na inicialização - TX |
| 3 | INFOhm (multímetro 1) | INFOhm (multímetro 1) | 3.3V | 0V na inicialização - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
| PIN | Resistência a GND | Resistência a VCC | V | Notas |
|---|
| 1 | ||||
| ... | ||||
| 10 | ||||
| ... |
Exemplo
| PIN | Resistência a GND | Resistência a VCC | V | Notas |
|---|---|---|---|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (multímetro 1) | INFOhm (multímetro 1) | 2.1V | Alta impedância, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (multímetro 1) | INFOhm (multímetro 1) | 0V | Não conectado? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (multímetro 1) | INFOhm (multímetro 1) | 0V | Não conectado? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |
-dKernel headers para Manually specified linux versionCustom kernel headers series para $DEVICEKERNELVERSIONLinux version para $DEVICEKERNELVERSIONC library para $DEVICECLIBRARY$DEVICECLIBRARY version para $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesEnable IPv6Enable RPCEnable WCHARThread library implementation para linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version para $LATESTGDBVERSIONSystem configuration
Passwords encoding para MD5Init system para $DEVICEINITSYSTEM (ou BusyBox)/dev management para Dynamic using devtmpfs only/bin/sh para Busybox default shellInstall timezone infoKernel
Kernel version para $DEVICEKERNELVERSIONKernel binary format para vmlinuxTarget packages
Compressors and decompressors
bzip2 e xz-utilsDebugging profiling and benchmark
gdb e full debuggerDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools (ou o que você precisar)Libraries
Crypto
libsha1libssh2opensslJSON/XML
expatjson-cNetworking applications
rsync e o que você precisarShell and utilities
fileFilesystem images
ext2Host utilities (não se trata do dispositivo alvo; aqui estamos falando do host)
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