
Шпаргалка по аппаратному взлому
[[TOC]]
250-350 CVCC и GND очень полезноGND, IN или RX, OUT или TX и VCC3/4 контакта на PCB
GND
GNDVCC
VCCGND (мультиметр в режиме измерения сопротивления, обычно )3.3V или 5V), иначе плата или адаптер будут поврежденыRX платы к TX адаптера и TX платы к RX адаптера
VCC не нужноsudo lsusb, чтобы найти адаптерls -lart /dev, чтобы найти все файлы устройств; наше должно быть одним из последних, обычно ttyUSB0dialout (или быть ); чтобы проверить свои группы, используйте 0 или 1TCK, TDI, TDO, TMS и TRST (опционально)
TCK (Test Clock): барабанщик или метроном, задающий скорость контроллера. Напряжение на этом контакте просто пульсирует вверх и вниз в ритмичном, ровном темпе. На каждый «удар» тактового генератора контроллер выполняет одно действие.TMS (Test Mode Select): напряжение на контакте выбора режима управляет тем, какое действие выполняет JTAG. Манипулируя напряжением на этом контакте, вы указываете JTAG, что хотите, чтобы он делал.3.3V или 5V), иначе плата или последовательный адаптер будут поврежденыopenocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE: справочник по плате Focaccia$BOARDCONFIGFILE: конфигурационный файл взламываемой вами платы (полезно, но, возможно, у вас его не будет; необязательно)
/usr/local; возможно, здесь вы найдёте полезный $BOARDCONFIGFILEU-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048: размер страницы (байт)mtd->oobsize=64: данные, используемые для коррекции ошибок (байт)devinfo.iowidth=8: данные, записываемые/читаемые за одну операцию (байт)mtd->erasesize=131072: оставшееся количество перезаписей EEPROM? (более или менее)TODO SPI DUMP
TODO GDB ATTACH????
/etc/rc/etc/rc.local/etc/rc.conf/etc/rc.d//etc/inittab
runlevel
1: однопользовательский режим, root-оболочка, без пароля, без запущенных демонов3: текстовый многопользовательский режим, приглашение входа5: графический вход в систему/etc/init.d/fileНайдите формат исполняемого файла QEMU: qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipselЕсли вы знаете семейство процессора, вы можете указать его, чтобы помочь QEMU лучше эмулировать среду
$QEMUBIN -cpu helpНам нужны ядро и корневая файловая система
Найдите версию ядра, версию libc и список библиотек, используемых интересующим нас исполняемым файлом (readelf -d $EXECUTABLE)
200kVCC (мультиметр в режиме измерения сопротивления, обычно 200kOhm)GND (мультиметр в режиме измерения напряжения, обычно 20V)TX UART по напряжению относительно GND (мультиметр в режиме измерения напряжения, обычно 20V); если напряжение колеблется, то это, вероятно, TX (потому что он передаёт данные)RX UART по напряжению относительно GND (мультиметр в режиме измерения напряжения, обычно 20V); если напряжение застряло на 0, то это, вероятно, RX (потому что он ждёт приёма данных)Таблица
| PIN | сопротивление GND | сопротивление VCC | V | Примечания |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Пример
115200)H — функция печати справки, используйте её вездеGND платы к GND Jtagulator, контакты платы 1,2,3 к каналам 1,2,3 JtagulatorV: установите рабочее напряжениеU: войдите в меню идентификации UARTU: начните идентификациюText string to output: по умолчаниюStarting channel: канал, куда мы подключили контакт 1 платыEnding channel: канал, куда мы подключили контакт 3 платыIgnore non-printable characters: Даrootgroups $USERscreen /dev/ttyUSB0 $BAUDRATE для подключения к TTY
$BAUDRATE может быть одним из тех, что указаны здесь$BAUDRATE
1152009600576003840019200$BAUDRATE, можем увидеть абракадабру или вообще НИЧЕГОctrl + a -> k -> y: закрыть screenRX не работает (вы печатаете и нажимаете enter, но ничего не происходит), возможно, неправильное значение "enter": \r\n или \n?
pyserial, библиотеку Python для последовательной связи, пример:
#!/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): контакт, через который данные поступают в чип. Стандарт JTAG не определяет протоколы связи через этот контакт. Это остаётся на усмотрение производителя. Для JTAG этот контакт — просто способ попадания 1 и 0 внутрь чипа. Что чип с ними делает, для JTAG не важно.TDO (Test Data-Out): контакт для данных, выходящих из чипа. Как и для контакта данных на входе, протоколы связи не определяются стандартом JTAG.TRST (Test Reset, опционально): этот сигнал используется для сброса JTAG в известное хорошее состояние.5/6 контактов или двойной ряд из 10, 12, 14, 20 контактов на PCB
GND
GNDVCC
VCCGND (мультиметр в режиме измерения сопротивления, обычно 200k)VCC (мультиметр в режиме измерения сопротивления, обычно 200kOhm)GND (мультиметр в режиме измерения напряжения, обычно 20V)Таблица
115200)H — функция вывода помощи, используйте её вездеGND платы к GND Jtagulator, контакты платы 1,2,3... к каналам Jtagulator 1,2,3...V: установите рабочее напряжениеJ: войдите в меню определения JTAGI: идентификация с помощью сканирования IDCODE, не найдёт TDI (быстро), лучше, если нужно идентифицировать много контактовB: идентификация с помощью сканирования BYPASS, найдёт TDI (медленно), лучше, если контактов для идентификации меньшеStarting channel: канал, куда мы подключили контакт 1 платыEnding channel: канал, куда мы подключили контакт n платыAlready known pins: Нет, но это может ускорить процесс, если мы уже знаем некоторые контакты300Ohm или 1kOhm между этим контактом и VCCtelnet localhost 4444
halt: остановить CPU (как заморозка)
reset: сбросить CPUreg: прочитать регистры CPUflash info bank $BANKID или flash info $BANKID: выводит информацию о банке флэш-памяти $BANKID (я думаю, банки = блок памяти)flash list: получает список ассоциативных массивов для каждого устройства, объявленного с помощью flash bank (в $BOARDCONFIGFILE), нумерация с нуляflash banks: выводит однострочную сводку по каждому устройству, объявленному с помощью flash bank (в $BOARDCONFIGFILE), нумерация с нуляflash write_image erase "$BINTOWRITE" $ADDRTOSTART: записать во флэш-память
$BINTOWRITE: может быть bin (двоичный), ihex (Intel hex), elf (ELF-файл), s19 (Motorola s19), mem...$ADDRTOSTART: адрес, с которого начать запись (я думаю, по умолчанию 0)flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: дамп памяти
$OUTFILE: двоичный файл для сохранения дампа$ADDRTOSTART: адрес, с которого начать чтение (я думаю, по умолчанию 0)$SIZETODUMP: количество байт для дампаinit started или что-то подобное; это, вероятно, будет рядом со строкой BusyBox или чем-то аналогичнымhelp — ваш другbinwalk, file и hexdump -C, чтобы проверить, в порядке ли сброшенный файл, и является ли он сжатым или зашифрованным
binwalk -E анализируем энтропию файла
1: случайный, сжатый или зашифрованный файл1: обычный исполняемый файл или обычный файлbinwalk -e для извлечения идентифицируемых сегментов файлаbinwalk не полностью понимает сброшенный образ, мы можем использовать таблицу разделов EEPROM (если она была найдена ранее), чтобы вручную разделить сброшенный образ на несколько полезных образов
dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITEsha1sum, md5sum или binwalk -W -i для сравнения образов (если, например, мы думаем, что они могут быть одним и тем же образом)binwalk (или dd, если мы сможем найти в интернете, как устроен наш конкретный образ ядра), чтобы прочитать корневую файловую системуfakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
fakeroot: создаёт поддельное root-окружение; полезно для эмуляции прав на файлы, файлов устройств...
-s fakeroot.dat: сохранить поддельное root-окружение для последующего восстановления командой fakeroot -i fakeroot.dat bashusquashfs: извлекает файловую систему squashfs (в вашем случае может отличаться)
-d squashfs-root: папка назначенияu04-sqfs.dat: образ файловой системы для извлечения/sbin/init, ища информацию (указанную выше), идентифицирующую типыfactory mode; если нам удастся перевести устройство в заводской режим (если он существует), взломать его станет намного прощеgrepfindxargsstringslibfoo.X.Y.ZX.Y.ZX несовместимый ABIY обратно совместимый ABIZ без изменений ABIX.Y совпадало с оригинальной библиотекой
X, более высокое YСоберите с помощью системы сборки (выбирайте функции и автоматически отслеживайте зависимости)
Начните эмуляцию
#!/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 следующим образом (внутри машины): 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
```# Part 5: Mount
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND ID, bytes print are in order first, second and fourth bytewritesize, oobsize, erasesize, iowidth to find here the correct commandflash_erase command is their size correlated to the erasesize (same as parts=x,y,z,...)-O: specify the volume id header offset, if wrong the system should tell you the right value anyway you could try different values like 512, 1024, 2048 (trial and error)-m: mtd device number (see point 3)-d: UBI device number (see point 5)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L (or see man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)make manual to create buildroot's manualmake help buildroot prints all supported devices (boards); make $YOURBOARDNAME to create a buildroot configuration file of your boardmake menuconfig (text based) or make xconfig (GUI) to select kernel modules to add to our build, we'll use make xconfig
Edit->Find to search for modulesTarget options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols with highest debug levelStrip command for binaries on target to NoneGCC optimization level to 0Toolchain
Toolchain type to Buildroot toolchainKernel headers to Manually specified linux versionmake savedconfigmake linux-menuconfig (text based) or make linux-xconfig (GUI), here we'll use CLI version
Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulatorKernel type -> Device drivers -> -> -> uClibc (or your c lib) using uclibc-menuconfig (as always)
Development/Debugging options -> Enable debugging symbols, if this doesn't work (compiling errors) then Development/Debugging options -> (Wall) compiler warnings -> add -Wall -ggdb -g3
-ggdb: provides debugging info to use with GDB-g3: provide extra debugging informationSavemake, if problems iterate back
Need to use -fPIC
--enable-shared in kernel modules (point 7) under Toolchain -> Additional gcc options or patch buildrootbr2)
+-- board/
| +-- <company>/ (not always used)
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- kernel-defconfig (kernel config file)
| +-- <other configuration files>
| +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
| +-- post_image.sh
| +-- rootfs_overlay/ (everythin here will be copied in the final image)
| | +-- etc/
| | +-- <some file>
| +-- patches/
| +-- foo/
| | +-- <some patch>
| +-- libbar/
| +-- <some other patches>
|
+-- configs/
| +-- <boardname>_defconfig (buildroot config for our board)
| +-- uClibc.config (optional)
+-- patches/
| +-- (here patches to be applied)
|
+-- Config.in (if using a br2-external tree)
+-- external.mk (if using a br2-external tree)
+-- external.desc (if using a br2-external tree)
make BR2_EXTERNAL=$PATHTOEXTTREE $COMMANDmake BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig| PIN | сопротивление GND | сопротивление VCC | V | Примечания |
|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V при загрузке - TX |
| 3 | INFOhm (мультиметр 1) | INFOhm (мультиметр 1) | 3.3V | 0V при загрузке - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
| PIN | сопротивление GND | сопротивление VCC | V | Примечания |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
Пример
| PIN | сопротивление GND | сопротивление VCC | V | Примечания |
|---|---|---|---|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (мультиметр 1) | INFOhm (мультиметр 1) | 2.1V | Высокий импеданс, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (мультиметр 1) | INFOhm (мультиметр 1) | 0V | Не подключено? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (мультиметр 1) | INFOhm (мультиметр 1) | 0V | Не подключено? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |
Custom kernel headers series to $DEVICEKERNELVERSIONLinux version to $DEVICEKERNELVERSIONC library to $DEVICECLIBRARY$DEVICECLIBRARY version to $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesEnable IPv6Enable RPCEnable WCHARThread library implementation to linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version to $LATESTGDBVERSIONSystem configuration
Passwords encoding to MD5Init system to $DEVICEINITSYSTEM (or BusyBox)/dev management to Dynamic using devtmpfs only/bin/sh to Busybox default shellInstall timezone infoKernel
Kernel version to $DEVICEKERNELVERSIONKernel binary format to vmlinuxTarget packages
Compressors and decompressors
bzip2 and xz-utilsDebugging profiling and benchmark
gdb and full debuggerDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools (or what you will need)Libraries
Crypto
libsha1libssh2opensslJSON/XML
expatjson-cNetworking applications
rsync and what you needShell and utilities
fileFilesystem images
ext2Host utilities (not about target device, we are talking about host device here)
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