[[TOC]]
250-350 CGND、IN 或 RX、OUT 或 TX 以及 VCC3/4 个引脚
GND 参考点
GNDVCC 参考点
VCC 处有一个点GND 的电阻(万用表转到电阻测量档,通常 200k)VCC 的电阻(万用表转到电阻测量档,通常 )3.3V 或 5V),否则板子或串口适配器会损坏RX 连接到适配器的 TX,板子的 TX 连接到适配器的 RX
VCC 引脚sudo lsusb 定位适配器ls -lart /dev 定位所有设备文件;我们的设备应该是最后几个之一,通常是 ttyUSB0dialout 组(或为 root),可用 groups $USER 检查我们的组0 或 1TCK、TDI、TDO、TMS 和 TRST(可选)
TCK(测试时钟):相当于鼓手或节拍器,决定控制器的速度。该引脚上的电压只是以有节奏、稳定的节拍上下脉冲。在时钟的每个“节拍”上,控制器都会执行一个动作。TMS(测试模式选择):模式选择引脚上的电压控制 JTAG 执行什么操作。通过操纵该引脚上的电压,你告诉 JTAG 你希望它做什么。TDI(测试数据输入):向芯片输入数据的引脚。JTAG 标准未定义通过该引脚通信的协议,这由制造商决定。就 JTAG 而言,该引脚只是让 1 和 0 进入芯片的入口。芯片如何处理这些数据与 JTAG 无关。3.3V 或 5V),否则板卡或串行适配器将被损坏openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE:Focaccia Board 参考$BOARDCONFIGFILE:你正在破解的板卡的配置文件(有用,但可能没有,可选)
/usr/local,也许可以在这里找到一些有用的 $BOARDCONFIGFILEtelnet localhost 4444
halt:停止 CPU(类似冻结)
U-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048:页大小(字节)mtd->oobsize=64:用于纠错的数据(字节)devinfo.iowidth=8:每次操作写入/读取的数据(字节)mtd->erasesize=131072:EEPROM 剩余写入次数?(大致)init started 或类似内容,这可能靠近 BusyBox 字符串或类似内容TODO SPI DUMP
TODO GDB ATTACH????
/etc/rc/etc/rc.local/etc/rc.conf 中的信息/etc/rc.d//etc/inittab
runlevel
1:单用户模式,root shell,无密码,无守护进程运行3:基于文本的多用户模式,登录提示5:图形化登录/etc/init.d//sbin/init,搜索上述用于识别类型的信息file 命令即可轻松获得找到 QEMU 可执行文件格式:qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipsel如果你知道处理器家族,可以指定它来帮助 QEMU 更好地仿真环境
$QEMUBIN -cpu help我们需要内核和根文件系统
查找内核版本、libc 版本以及我们感兴趣的二进制文件所使用的库列表(readelf -d $EXECUTABLE)
libfoo.X.Y.Z(X.Y.Z 是版本号)
X:ABI 不兼容Y:ABI 向后兼容200kOhmGND 的电压(万用表转到电压测量档,通常 20V)TX UART 引脚对 GND 的电压(万用表转到电压测量档,通常 20V);如果电压在振荡,那么该引脚很可能是 TX(因为它在发送数据)RX UART 引脚对 GND 的电压(万用表转到电压测量档,通常 20V);如果电压一直停在 0,那么该引脚很可能是 RX(因为它在等待接收数据)表格
| 引脚 | GND 电阻 | VCC 电阻 | V | 备注 |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
示例
115200)H 是打印帮助功能,请随处使用它GND 连接到 Jtagulator 的 GND,板子的引脚 1,2,3 连接到 Jtagulator 的通道 1,2,3V:设置工作电压U:进入 UART 识别菜单U:开始识别Text string to output:默认Starting channel:我们放置板子引脚 1 的通道Ending channel:我们放置板子引脚 3 的通道Ignore non-printable characters:是screen /dev/ttyUSB0 $BAUDRATE 连接到 TTY
$BAUDRATE 可以是 这里 找到的其中一个$BAUDRATE
1152009600576003840019200$BAUDRATE,可能会看到乱码,甚至什么也没有ctrl + a -> k -> y:关闭 screen\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")
TDO(测试数据输出):用于输出芯片数据的引脚。与数据输入引脚一样,通信协议不由 JTAG 定义。TRST(测试复位,可选):该信号用于将 JTAG 复位到已知的良好状态。5/6 个引脚,或双排 10、12、14、20 个引脚
GND 参考点
GNDVCC 参考点
VCC 处有一个点GND 的电阻(万用表转到电阻测量档,通常 200k)VCC 的电阻(万用表转到电阻测量档,通常 200kOhm)GND 的电压(万用表转到电压测量档,通常 20V)表格
115200)H 是打印帮助功能,随处可用GND 连接到 Jtagulator GND,板卡引脚 1,2,3... 连接到 Jtagulator 通道 1,2,3...V:设置工作电压J:进入 JTAG 识别菜单I:使用 IDCODE 扫描识别,找不到 TDI(快),如果要识别的引脚很多,这个更好B:使用 BYPASS 扫描识别,会找到 TDI(慢),如果要识别的引脚较少,这个更好Starting channel:放置板卡引脚 1 的通道Ending channel:放置板卡引脚 n 的通道Already known pins:否,但如果已经知道某些引脚,可以加快识别过程VCC 之间放置一个约 300Ohm 或 1kOhm 的电阻来解决reset:重置 CPUreg:读取 CPU 寄存器flash info bank $BANKID 或 flash info $BANKID:打印 flash 存储区 $BANKID 的信息(我认为 bank = 内存块)flash list:检索使用 flash bank(在 $BOARDCONFIGFILE 中)声明的每个设备的关联数组列表,从零开始编号flash banks:打印使用 flash bank(在 $BOARDCONFIGFILE 中)声明的每个设备的一行摘要,从零开始编号flash write_image erase "$BINTOWRITE" $ADDRTOSTART:写入 flash
$BINTOWRITE:可以是 bin(二进制)、ihex(Intel hex)、elf(ELF 文件)、s19(Motorola s19)、mem……$ADDRTOSTART:开始写入的地址(我认为默认是 0)flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP:转储内存
$OUTFILE:保存转储内容的二进制文件$ADDRTOSTART:开始读取的地址(我认为默认是 0)$SIZETODUMP:要转储的字节数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 bash 恢复usquashfs:提取 squashfs 文件系统(在你的情况下可能不同)
-d squashfs-root:目标文件夹u04-sqfs.dat:要提取的文件系统镜像factory mode 字符串;如果我们成功让设备进入工厂模式(如果存在的话),破解它就容易得多grepfindxargsstringsZ:无 ABI 变化X.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,打印的字节按顺序为第一个、第二个和第四个字节writesize, oobsize, erasesize, iowidth 在这里找到正确的命令flash_erase 命令中的最后一个数字是与 erasesize 相关的大小(与 parts=x,y,z,... 相同)-O:指定卷 ID 头偏移量,如果错误,系统会告诉你正确的值,你也可以尝试不同的值,如 512, 1024, 2048(反复试验)-m:mtd 设备编号(参见第 3 点)-d:UBI 设备编号(参见第 5 点)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L 传递包含该解释器的文件夹的路径(或参见 man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)make manual 以生成 buildroot 的手册make help,buildroot 会打印所有支持的设备(开发板);执行 make $YOURBOARDNAME 可为你的开发板创建 buildroot 配置文件make menuconfig(基于文本)或 make xconfig(GUI)选择要添加到我们构建中的内核模块,我们将使用 make xconfig
Edit->Find 来搜索模块Target options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols,并将 debug level 设为最高Strip command for binaries on target 设置为 NoneGCC optimization level 设置为 0Toolchain
Toolchain type 设置为 Buildroot toolchainKernel headers 设置为 Manually specified linux versionCustom kernel headers series 设置为 $DEVICEKERNELVERSIONLinux version 设置为 $DEVICEKERNELVERSIONC library 设置为 $DEVICECLIBRARY$DEVICECLIBRARY version 设置为 $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesSystem configuration
Passwords encoding 设置为 MD5Init system 设置为 $DEVICEINITSYSTEM(或 BusyBox)/dev management 设置为 Dynamic using devtmpfs only/bin/sh 设置为 Busybox default shellInstall timezone infoKernel
Kernel version 设置为 $DEVICEKERNELVERSIONKernel binary format 设置为 vmlinuxTarget packages
Compressors and decompressors
bzip2 和 xz-utilsDebugging profiling and benchmark
gdb 和 full debuggerDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools(或你需要的任何工具)Libraries
Crypto
libsha1Networking applications
rsync 以及你需要的工具Shell and utilities
fileFilesystem images
ext2Host utilities(这里不是指目标设备,我们谈论的是主机设备)
host mtd, jffs2 and ubi/ubifs toolshost util-linuxmake savedconfigmake linux-menuconfig(基于文本)或 make linux-xconfig(GUI)配置内核,这里我们将使用 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 -> Memory technology device (MTD) support -> -> uclibc-menuconfig 配置 uClibc(或你的 C 库)(和往常一样)
Development/Debugging options -> Enable debugging symbols,如果这不起作用(编译错误),则使用 Development/Debugging options -> (Wall) compiler warnings -> 添加 -Wall -ggdb -g3
-ggdb:提供与 GDB 一起使用的调试信息-g3:提供额外的调试信息Savemake,如果出现问题则返回上一步迭代
Need to use -fPIC
Toolchain -> Additional gcc options 下添加 --enable-shared,或者修补 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 savedefconfigmake BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig| 引脚 | GND 电阻 | VCC 电阻 | V | 备注 |
|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V 启动时 - TX |
| 3 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 3.3V | 0V 启动时 - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
| 引脚 | GND 电阻 | VCC 电阻 | V | 备注 |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
示例
| 引脚 | GND 电阻 | VCC 电阻 | V | 备注 |
|---|---|---|---|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 2.1V | 高阻抗,TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | 未连接? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | 未连接? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |
Enable IPv6Enable RPCEnable WCHARThread library implementation 设置为 linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version 设置为 $LATESTGDBVERSIONlibssh2opensslJSON/XML
expatjson-cUBI - Unsorted block imagesEnable UBIFile systems -> Miscellaneous filesystem -> JFFS2 supportFile systems -> Miscellaneous filesystem -> UBIFS filesystem supportSavemake BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig