利用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 “因地制宜 本质是实事求是” 7904013
- 2 日本将不再有大熊猫 7808923
- 3 《怦然心动》导演与妻子家中遇害 7713502
- 4 中央经济工作会议中的“民生看点” 7619168
- 5 首批L3自动驾驶车型获批 7523528
- 6 北京雪地上有蚊子在爬?专家回应 7426129
- 7 小吃街一夜间换上同一个收款码 7329378
- 8 亚运会金牌得主举报比赛奖金被索要 7238504
- 9 高考604分就读高职 7140947
- 10 明年经济工作到底怎么做 7043494

Chamd5安全团队
