利用UART串口调试提取360路由器固件
通过proc文件系统查看mtd设备的分区情况,可以发现mtdN和mtdblockN描述的是同一个MTD分区,对应同一个硬件分区。两者是同一个MTD分区的两种不同描述:mtdN是实现MTD分区所对应的字符设备,而mtdblockN设备则是在对应生成的块设备,两者内容一致,但具体的ioctl命令操作是不同的。
出于保密性,在这里不透露具体型号。通过简要分析和丝印查阅,可以得知固件存储于红色框的flash中,如下图所示。
但幸运的是,电路板上留存了UART调试串口,并且标注了各个接口的属性(GND、RX、TX等)。接下来就可以通过连接UART进行串口调试的操作。
仔细观察设备启动的全过程,我们发现其bootloader启动时,给我们提供了一次进入系统的机会,即在某个时候按下f可进入failsafe mode,而在该模式下,我们可获取其中的linux shell并进行命令输入,即可“看”到整个设备的文件系统,如下图所示。
然而,由于此时设备并没有完全启动成功,所以其与外界是断联的,无法与外界进行通信。而这显然不能很好地帮助我们进行分析。那么如何在断网的情况下,导出整个文件系统,则是接下来需要解决的问题。
通过查看/proc/mtd,可以得知各个mtd分区的基本信息描述,其中mtd10,mtd11,mtd13则有可能是我们所需分析的文件系统,如下图所示。
由于此时设备与我们的交互只能停留在命令行的回显中,一个很巧妙的方法则是将对应的mtd分区内容转换为可见字符(如hexdump,base64),我们记录命令行的输出回显则可以获取整个文件系统。但是这里需要注意的是,由于mtd分区内容较多,且嵌入式设备处理性能有限,只能通过结合SecureCRT脚本编写,分段记录mtd分区。
关键代码如下:
def send_cmd(fp,offset,step):
crt.Screen.Synchronous = True
# Send the initial command then throw out the first linefeed that we
# see by waiting for it.
crt.Screen.Send("hexdump {} -s {} -n {}\n".format("/dev/mtdN",offset,step))
crt.Screen.WaitForString("\n")
# Create an array of strings to wait for.
promptStr = "root"
waitStrs = ["\n", promptStr]
row = 1
while True:
# Wait for the linefeed at the end of each line, or the shell
# prompt that indicates we're done.
result = crt.Screen.WaitForStrings( waitStrs )
# If we saw the prompt, we're done.
if result == 2:
break
# The result was 1 (we got a linefeed, indicating that we
# received another line of of output). Fetch current row number
# of the cursor and read the first 20 characters from the screen
# on that row.
#
# This shows how the 'Get' function can be used to read
# line-oriented output from a command, Subtract 1 from the
# currentRow to since the linefeed moved currentRow down by one.
#
screenrow = crt.Screen.CurrentRow - 1
readline = crt.Screen.Get(screenrow, 1, screenrow, 48)
readline = readline.strip()
# NOTE: We read 48 characters from the screen 'readline' may
# contain trailing whitespace if the data was less than 48
# characters wide.
# Write the line out with an appended end-of-line sequence
fp.write(readline)
crt.Screen.Synchronous = False
本文总结了一种利用UART串口调试获取设备的文件系统的方法,其关键在于通过hexdump或base64等将不可见字符转换为终端可回显的字符。
[1] https://bbs.pediy.com/thread-230095.htm
[2] https://zhuanlan.zhihu.com/p/26745577
结束
招新小广告
ChaMd5 Venom 招收大佬入圈
新成立组IOT+工控+样本分析 长期招新
欢迎联系admin@chamd5.org
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 习近平拉美之行的三个“一” 7927249
- 2 微信或史诗级“瘦身” 内存有救了 7986199
- 3 男子求助如何打开亡父遗留14年手机 7888414
- 4 中国主张成为G20峰会的一抹亮色 7769891
- 5 男子举报县委副书记出轨自己老婆 7672902
- 6 7万余件儿童羽绒服里没有真羽绒 7533524
- 7 中国对日本等国试行免签 7409944
- 8 70多辆小米SU7同一天撞墙撞柱 7328641
- 9 男子携带小孩跳海 官方通报 7231396
- 10 千年古镇“因网而变、因数而兴” 7154436