导语:对于CPU体系结构,操作系统和文件系统来说,嵌入式设备是一个广阔的世界。你可以找到可以想到的各种架构组合,我将在本文介绍有关TP-Link TL-WR543G的研究,我在家中使用的旧路由器是MIPS CPU,是VxWorks的操作系统。
基本介绍
对于CPU体系结构,操作系统和文件系统来说,嵌入式设备是一个广阔的世界。你可以找到可以想到的各种架构组合,我将在本文介绍有关TP-Link TL-WR543G的研究,我在家中使用的旧路由器是MIPS CPU,是VxWorks的操作系统。
https://static.tp-link.com/resources/document/datasheet/TL-WR543G_ds.zip https://www.windriver.com/products/vxworks/
在此文章中,我将向你展示此基于VXWorks的设备的逆向过程,我将描述我的漏洞发现,以及在处理固件和二进制分析时出现的问题,记录一下分析过程。
VxWorks概述
如前所述,WR543G路由器运行的是VxWorks,VxWorks是由Wind River Systems开发的专有RTOS。它支持许多体系结构,例如Intel,Power-PC,ARM,MIPS等。它有自己的开发套件,称为Wind River Workbench,其中包括编辑器,编译器工具链,调试器和仿真器。
VxWorks在市场上被很多产品使用:航空航天和国防,汽车,机器人等工业,消费电子产品,医疗领域和网络。
由于VXWorks是专有操作系统,因此具有许多特定于供应商的属性,其中包括安全模型。例如,用户程序的堆栈溢出检测,固件结构和文件系统也是特定于供应商的。
如果像我一样习惯于逆向包括类Unix操作系统的其他类型的设备,你会发现Grail需要更多的工作才能获得VxWorks系统。
如果你想了解有关VxWorks的更多信息,可以参考本文结尾处与VxWorks相关的工作部分。
https://blog.quarkslab.com/reverse-engineering-a-vxworks-os-based-router.html#vxworks-related-work
这不是我第一次研究此路由器,前段时间,我尝试还原固件,但是在该路径上没有取得太大进展。因此,我决定拆开分析看看里面有什么。硬件分析方法也使我陷入了僵局,因为当时我不想拆焊任何东西,所以我暂时搁置一会儿。我想了解固件的编译方式以及可以从中提取什么以进行更深入的分析,没有太多有关VxWorks内部信息的信息,只有devttys0的一些帖子。但是,这些足以使我在逆向过程中取得一些进展。因此,在简短介绍了硬件分析之后,我将重点介绍固件分析。
硬件分析
基本描述
· CPU: Atheros AR2317-AC1A (all integrated, WiFi, MIPS 4000)
· Flash: Z-16PGJI-016S338-S9178PC7 (2MB?)
· SDRAM: EM639165TS-6G, 16 MB
· Ethernet: Marvell 88E6060-RCJ1
· UART: Yes
关于flash,先前版本(WR542G)的大小为2 MB,我找不到太多的序列号信息,因此我想在这种情况下,flash的大小是相似的。
以下是主板上的一些图片。
正面图
背面图
CPU,RAM,flash
串行端口
查看主板时,你会发现有一个类似于UART(通用异步接收器-发送器)的引脚排列。我按照devttys0博客中提到的方法进行了逆向。
http://www.devttys0.com/2012/11/reverse-engineering-serial-ports/
你可以在下图中看到它们:
这些是UART参数:COM3(在我的设备上是这个,请检查你的参数),波特率:38400
设置UART接口后,便可以访问启动日志和启动菜单:
AR2315 rev 0x00000090 startup... Attached TCP/IP interface to ae unit 0 Attaching interface lo0...done USRCONF : g_size = 18112 Name = MODULE_USR_CONF_T , size = 12 Name = UC_IEEE802_1X_CFG_DATA_T , size = 512 Name = UC_ADVANCED_CFG_T , size = 16 Name = UC_ARP_CFG_T , size = 32 Name = UC_BPA_CFG_DATA_T , size = 912 Name = UC_DDNS_T , size = 1480 Name = UC_DHCPC_CFG_DATA_T , size = 416 Name = UC_DHCPS_CFG_AND_STATIC_T , size = 708 Name = UC_FIRE_WALL_STATE_T , size = 1992 Name = UC_FORWARD_VIRTUAL_SERVE_CLASS_T , size = 1572 Name = UC_IFQOS_ROUTER_CONF_FLASH_T , size = 120 Name = UC_LAN_CFG_DATA_T , size = 8 Name = UC_L2TP_CFG_DATA_T , size = 1472 Name = UC_MAC_CONFIG_T , size = 80 Name = UC_PPPOE_CFG_DATA_T , size = 1568 Name = UC_NTP_PREFER_SRV_CFG_DATA_T , size = 28 Name = UC_STATIC_IP_CFG_DATA_T , size = 144 Name = UC_SATTIC_ROUTE_CFG_DATA_T , size = 328 Name = UC_MANAGE_USERS_T , size = 64 Name = UC_UTILITIES_T , size = 16 Name = UC_WANCONNTYPE_T , size = 16 Name = UC_WLAN_CFG_T , size = 5020 Name = UC_PPTP_CFG_DATA_T , size = 1472 Name = UC_NETWORK_PSEUDO_T , size = 4 Name = UC_IFQOS_ROUTER_CONF_FLASH_T , size = 120 Port QoS.................. qos_IFInit.................. qos_IFLoadFromFlash.................. wireless access point starting... wlan0 Ready entering tddp... Software Platform for ARM Copyright(C) 2001-2004 by TP-LINK TECHNOLOGIES CO., LTD. Creation date: Sep 4 2008, 17:18:51 Press CTRL-B to enter bootmenu... Boot Menu: 1: Download application program 2: Modify Bootrom password 3: Exit the menu 4: Reboot 5: User commond line
一件有趣的事是引导日志引用的是AR2315而不是AR2317。AR2315的是MIPS 4KE 32位与183 MHz处理器。
另一件事是,启动菜单不起作用,如果你输入报告中的命令,则什么都不会发生。但是,当尝试其他键时,我们得到以下结果:
· n:netstat
Boot Menu: 1: Download application program 2: Modify Bootrom password 3: Exit the menu 4: Reboot 5: User commond line Enter your choice(1-4):n 413 Active Internet connections (including servers) PCB Proto Recv-Q Send-Q Local Address Foreign Address (state) -------- ----- ------ ------ ------------------ ------------------ ------- 80fb7f08 TCP 0 0 0.0.0.0.80 0.0.0.0.0 LISTEN 80fb8538 UDP 0 0 0.0.0.0.2050 0.0.0.0.0 80fb84b4 UDP 0 0 0.0.0.0.53 0.0.0.0.0 80fb8430 UDP 0 0 0.0.0.0.67 0.0.0.0.0 80fb83ac UDP 0 0 0.0.0.0.68 0.0.0.0.0
似乎HTTP服务器正在运行,这是nmap的报告:
Nmap scan report for 192.168.1.1 Host is up (0.0044s latency). Not shown: 98 filtered ports PORT STATE SERVICE 80/tcp open http 1900/tcp closed upnp MAC Address: 00:27:19:C1:76:52 (Tp-link Technologies)
· i: ifconfig
Boot Menu: 1: Download application program 2: Modify Bootrom password 3: Exit the menu 4: Reboot 5: User commond line Enter your choice(1-4):i ae (unit number 0): Flags: (0x8b63) UP BROADCAST MULTICAST PROMISCUOUS ARP RUNNING Type: ETHERNET_CSMACD Internet address: 192.168.1.1 Broadcast address: 192.168.1.255 Netmask 0xffffff00 Subnetmask 0xffffff00 Ethernet address is 00:27:19:c1:76:52 Metric is 0 Maximum Transfer Unit size is 1500 0 octets received 126 octets sent 0 packets received 3 packets sent 0 non-unicast packets received 0 non-unicast packets sent 0 unicast packets received 3 unicast packets sent 0 input discards 0 input unknown protocols 0 input errors 0 output errors 0 collisions; 0 dropped lo (unit number 0): Flags: (0x8069) UP LOOPBACK MULTICAST ARP RUNNING Type: SOFTWARE_LOOPBACK Internet address: 127.0.0.1 Netmask 0xff000000 Subnetmask 0xff000000 Metric is 0 Maximum Transfer Unit size is 32768 1 packets received; 1 packets sent 0 multicast packets received 0 multicast packets sent 0 input errors; 0 output errors 0 collisions; 0 dropped ae (unit number 1): Flags: (0x8b63) UP BROADCAST MULTICAST PROMISCUOUS ARP RUNNING Type: ETHERNET_CSMACD Internet address: 10.1.177.242 Broadcast address: 10.1.177.243 Netmask 0xff000000 Subnetmask 0xfffffffc Ethernet address is 00:1b:fc:0e:b1:f2 Metric is 0 Maximum Transfer Unit size is 1500 13696 octets received 27868 octets sent 31 packets received 63 packets sent 0 non-unicast packets received 31 non-unicast packets sent 31 unicast packets received 32 unicast packets sent 0 input discards 0 input unknown protocols 0 input errors 0 output errors 0 collisions; 0 dropped ppp (unit number 1): Flags: (0xb0) DOWN POINT-TO-POINT Type: PPP Metric is 0 Maximum Transfer Unit size is 1400 0 octets received 0 octets sent 0 packets received 0 packets sent 0 non-unicast packets received 0 non-unicast packets sent 0 unicast packets received 0 unicast packets sent 0 input discards 0 input unknown protocols 0 input errors 0 output errors
· m: meminfo
Boot Menu: 1: Download application program 2: Modify Bootrom password 3: Exit the menu 4: Reboot 5: User commond line Enter your choice(1-4):m 501 FREE LIST: num addr size ---- ---------- ---------- 1 0x80b693d0 64 2 0x80ffb1f0 13056 3 0x80ff6770 96 4 0x80b66b60 976 5 0x8038df30 8062064 6 0x80f9fb80 240 SUMMARY: status bytes blocks avg block max block ------ ---------- --------- ---------- ---------- current free 8076496 6 1346082 8062064 alloc 4973520 1459 3408 - cumulative alloc 4992304 1523 3277 -
· k: process list
Boot Menu: 1: Download application program 2: Modify Bootrom password 3: Exit the menu 4: Reboot 5: User commond line Enter your choice(1-4):k NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY ---------- ------------ -------- --- ---------- -------- -------- ------- ----- --tExcTask 801c19c4 80ff5380 0 PEND 801e3c50 80ff5260 0 0 -tLogTask 801c6c54 80ff27f0 0 PEND 801e3c50 80ff26d8 --- ---------- --------- --------- ---------- current free 8076496 6 346082 8062064 alloc 4973520 1459 3408 - cumulative alloc 4992304 1523 377 - 0 0 bootromTask8005ad30 80b65be0 8 READY 801dc998 80b64e40 3d0002 0 tWlanCal 800ef730 80be2ba0 10 PEND 801e3c50 80be2ab0 0 0 tApCserv 800de55c 80b6c8f0 10 PEND 801e3c50 80b6c800 0 0 Detectd 80022638 80b631d0 40 DELAY 801db708 80b63148 0 48 timerManage8006d7f0 80d44780 48 PEND+T 80158414 80d44708 3d0004 2 endRecvTask8005bce4 80b85020 49 PEND+T 801e3c50 80b84f10 3d0004 1 tNetTask 8019aab4 80fa4c90 50 PEND 80158414 80fa4c00 0 0 tApHouseKee800de9d0 80b74db0 50 DELAY 801db708 80b74d00 0 1533 dot1xTask 800f3a3c 80b6fd20 50 PEND+T 80158414 80b6fa90 3d0002 6 dhcpcState 800b4438 80de18d0 56 PEND 80158414 80de1830 0 0 dhcpcRead 800b4e10 80de02d0 56 PEND 80158414 80de00b8 3d0002 0 swDhcpcd 80062620 80dde870 56 PEND 801e3c50 80dde618 0 0 802_1X 80093c40 80b680e0 150 PEND+T 80158414 80b68060 3d0004 26 swL2tpd 80069944 80df8d80 198 PEND+T 801e3c50 80df8b08 3d0004 51 swPptpd 8006b4c4 80df2130 198 PEND+T 801e3c50 80df1eb8 3d0004 50 swPppoed 8006863c 80dfd670 199 PEND+T 801e3c50 80dfd3b0 3d0004 48 pppoed_0 8006fbd8 80dff8e0 200 PEND+T 801e3c50 80dff7c8 3d0004 17 pptpProc_0 8007aeac 80df43a0 200 PEND+T 801e3c50 80df4070 3d0004 1 l2tpd_0 80075bd4 80dfaff0 201 PEND+T 801e3c50 80dfaed8 3d0004 15 pptpd_0 800785f0 80df6610 201 PEND+T 801e3c50 80df64f0 3d0004 13 usrRebootd 80066648 80d452b0 202 PEND+T 801e3c50 80d451d0 3d0004 42 mud0_80 8002dd40 80f0ebf0 203 PEND+T 80158414 80f0e9b0 3d0002 581 tFWCONF 8008fbd8 80ddc960 203 DELAY 801db708 80ddc8d8 0 279 dnsProxyd 800c0728 80d475e0 204 PEND+T 80158414 80d473e0 3d0002 38 sntpd 800bf518 80d48e80 205 PEND+T 801e3c50 80d48d48 3d0004 37 sysExLogd 800201b0 80f388a0 240 PEND 80158414 80f38488 3d0002 0 dynTask 800c35fc 80d424d0 250 DELAY 801db708 80d42428 0 35 BPAd_0 800cb6e0 80decc80 253 DELAY 801db708 80decb48 0 33 dhcpsd 800a7688 80d4b3a0 254 PEND+T 80158414 80d4b178 3d0002 32 BPAm_0 800ce5c0 80dea210 255 DELAY 801db708 80dea170 0 31
但是,我没有找到通过此菜单获取shell的方法。
固件分析
资料下载:
[固件(全部可用)](https://www.tp-link.com/us/support/download/tl-wr543g/#Firmware)
[下载最新的可用版本](https://static.tp-link.com/resources/software/20081013145812.zip)
我路由器上运行的固件:3.7.1 Build 080904 Rel.62330n(最新版本)
硬件版本:WR543G v2 08118989
Binwalk分析
我对Binwalk的第一次解包返回以下结果:
fastix@bulin:~/wr543g$ binwalk wr543gv2-en-up.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 20132 0x4EA4 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 20228 0x4F04 VxWorks operating system version "5.5.1" , compiled: "Sep 4 2008, 17:18:57" 20324 0x4F64 Copyright string: "Copyright 1984-2002 Wind River Systems, Inc." 21685 0x54B5 Zlib compressed data, default compression
从Binwalk的输出中可以看到,有一个编译头显示了与VxWorks相关的字符串,具体地说,似乎我们使用的是VxWorks 5.5.1之前的版本。
最后还有一个Zlib压缩流,从偏移量0x54B5开始。没有引导加载程序,文件系统,内核文件。
为了提取Zlib压缩流,我只使用了命令binwalk -e file.bin。
通过查看未压缩流上的字符串,有一些有趣的细节:
ae(0,0)TP-MIPS:vxWorks h=192.168.1.18 e=192.168.1.5:0xffffff00 u=wr541 pw=123 f=0x0 tn=wr541 o=ae s=factory resetting to factory config.
重置路由器后,默认的用户名和密码组合为wr541 / 123。
如果我们再次对未压缩的流使用Binwalk,则结果如下:
fastix@bulin:~/wr543g/_wr543gv2-en-up.bin.extracted$ binwalk 54B5 DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 880412 0xD6F1C Certificate in DER format (x509 v3), header length: 4, sequence length: 1 880432 0xD6F30 Certificate in DER format (x509 v3), header length: 4, sequence length: 4 1916528 0x1D3E70 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 1917168 0x1D40F0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 1917808 0x1D4370 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 1918648 0x1D46B8 Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 393 1918760 0x1D4728 Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 408 1918852 0x1D4784 Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 423 1918944 0x1D47E0 Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 468 1919018 0x1D482A Unix path: /depot/sw/branches/mBSSID_dev/src/ap/os/vxworks/target/config/ar531xPlus/ae531xEnd.c#1 $ 1919594 0x1D4A6A Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 319 1919744 0x1D4B00 Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 703 1920008 0x1D4C08 Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 2188 1922144 0x1D5460 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 1923290 0x1D58DA Unix path: /depot/sw/branches/mBSSID_dev/src/ap/os/vxworks/target/config/ar531xPlus/sysLib.c#1 $ 1937472 0x1D9040 CRC32 polynomial table, big endian 1938879 0x1D95BF Copyright string: "Copyright 1995-2002 Jean-loup Gailly " 1939471 0x1D980F Copyright string: "Copyright 1995-2002 Mark Adler " 1945225 0x1DAE89 HTML document footer 1945892 0x1DB124 HTML document header 1947067 0x1DB5BB HTML document footer 1947076 0x1DB5C4 HTML document header 1947285 0x1DB695 HTML document footer 1947352 0x1DB6D8 HTML document header 1947392 0x1DB700 HTML document header 1949774 0x1DC04E HTML document footer 1954280 0x1DD1E8 Unix path: /rc_filesys/doc/dynaform/common.js 1954508 0x1DD2CC Unix path: /rc_filesys/doc/frames/top.htm 1959104 0x1DE4C0 HTML document header 1960860 0x1DEB9C HTML document footer 1960868 0x1DEBA4 GIF image data, version "87a", 16 x 41 1968256 0x1E0880 GIF image data, version "89a", 220 x 146 1973772 0x1E1E0C GIF image data, version "89a", 10 x 10 1973832 0x1E1E48 GIF image data, version "89a", 10 x 10 1973896 0x1E1E88 GIF image data, version "89a", 160 x 72 1978532 0x1E30A4 GIF image data, version "89a", 10 x 10 1978592 0x1E30E0 JPEG image data, JFIF standard 1.01 1982668 0x1E40CC JPEG image data, JFIF standard 1.01 1992460 0x1E670C JPEG image data, JFIF standard 1.02 1992490 0x1E672A TIFF image data, little-endian offset of first image directory: 8 1993684 0x1E6BD4 JPEG image data, JFIF standard 1.01 1994112 0x1E6D80 HTML document header 1994236 0x1E6DFC HTML document footer 1997632 0x1E7B40 HTML document header 2006161 0x1E9C91 HTML document footer 2010912 0x1EAF20 HTML document header 2013167 0x1EB7EF HTML document footer 2018806 0x1ECDF6 Copyright string: "Copyright(C) 2001-2004 by %s" 2023168 0x1EDF00 Unix path: /core/bsp/archives/ar2315/ar531xPlusreg.h-arc 1.5 01 Jun 2006 11:40:30 dai $ 2032413 0x1F031D Copyright string: "Copyright 2000 Wind River Systems, Inc." 2032645 0x1F0405 Copyright string: "Copyright 2001 Wind River Systems, Inc." 2032737 0x1F0461 Copyright string: "Copyright 2001 Wind River Systems, Inc." 2043168 0x1F2D20 XML document, version: "1.0" 2043572 0x1F2EB4 XML document, version: "1.0" 2047104 0x1F3C80 HTML document header 2047136 0x1F3CA0 HTML document footer 2061824 0x1F7600 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2069248 0x1F9300 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2069760 0x1F9500 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2070160 0x1F9690 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2072000 0x1F9DC0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2072688 0x1FA070 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2074288 0x1FA6B0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2074784 0x1FA8A0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2075088 0x1FA9D0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2075584 0x1FABC0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2076944 0x1FB110 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2078192 0x1FB5F0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2080528 0x1FBF10 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2082896 0x1FC850 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2085056 0x1FD0C0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2086560 0x1FD6A0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2087408 0x1FD9F0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2087936 0x1FDC00 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2089984 0x1FE400 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2090224 0x1FE4F0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2090464 0x1FE5E0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2090816 0x1FE740 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2091328 0x1FE940 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2091558 0x1FEA26 Unix path: /depot/sw/releases/4.1.2/src/hal/halUtil.c#1 $ 2092010 0x1FEBEA Unix path: /depot/sw/releases/4.1.2/src/hal/halBeacon.c#1 $ 2095206 0x1FF866 Unix path: /depot/sw/releases/4.1.2/src/hal/ar5212/ar5212Attach.c#9 $ 2099696 0x2009F0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2100512 0x200D20 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2101040 0x200F30 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2101600 0x201160 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2103120 0x201750 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2103376 0x201850 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2103888 0x201A50 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2105808 0x2021D0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2106592 0x2024E0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2107296 0x2027A0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2107920 0x202A10 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2118544 0x205390 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2121168 0x205DD0 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2121488 0x205F10 Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc 1.4 Dec 27 2005 15:00:04 dai $ 2159077 0x20F1E5 Unix path: /../ip_qos/src/config/qosTask.c, line 102 2159268 0x20F2A4 Unix path: /../ip_qos/src/config/qosTask.c, line 252 2159348 0x20F2F4 Unix path: /../ip_qos/src/config/qosTask.c, line 275 2159446 0x20F356 Unix path: /../ip_qos/src/config/qosTask.c, line 303 2159540 0x20F3B4 Unix path: /../ip_qos/src/config/qosTask.c, line 315 2159633 0x20F411 Unix path: /../ip_qos/src/config/qosTask.c, line 323 2159736 0x20F478 Unix path: /../ip_qos/src/config/qosTask.c, line 370 2159816 0x20F4C8 Unix path: /../ip_qos/src/config/qosTask.c, line 417 2159903 0x20F51F Unix path: /../ip_qos/src/config/qosTask.c, line 443 2160026 0x20F59A Unix path: /../ip_qos/src/core/qos_coreSch.c, line 206 2160114 0x20F5F2 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 217 2160198 0x20F646 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 254 2160295 0x20F6A7 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 364 2160368 0x20F6F0 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 460 2160471 0x20F757 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 488 2160564 0x20F7B4 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 491 2160672 0x20F820 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 501 2160774 0x20F886 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 502 2160848 0x20F8D0 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 583 2160953 0x20F939 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 776 2161057 0x20F9A1 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 813 2161159 0x20FA07 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 830 2161261 0x20FA6D Unix path: /../ip_qos/src/core/qos_coreSch.c, line 850 2161365 0x20FAD5 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 886 2161465 0x20FB39 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1088 2161553 0x20FB91 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1253 2161650 0x20FBF2 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1256 2161731 0x20FC43 Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1274 2161873 0x20FCD1 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 97 2161957 0x20FD25 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 141 2162043 0x20FD7B Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 147 2162146 0x20FDE2 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 164 2162233 0x20FE39 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 278 2162317 0x20FE8D Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 285 2162404 0x20FEE4 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 297 2162492 0x20FF3C Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 298 2162606 0x20FFAE Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 394 2162693 0x210005 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 483 2162777 0x210059 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 490 2162864 0x2100B0 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 506 2162952 0x210108 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 507 2163042 0x210162 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 516 2163135 0x2101BF Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 519 2163226 0x21021A Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 520 2163318 0x210276 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 523 2163405 0x2102CD Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 534 2163489 0x210321 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 536 2163719 0x210407 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 640 2163815 0x210467 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 721 2163896 0x2104B8 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 747 2163984 0x210510 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 782 2164066 0x210562 Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 835 2164266 0x21062A Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 880 2164484 0x210704 Unix path: /../ip_qos/src/if_config/testcase.c, line 180 2166310 0x210E26 Unix path: /core/bsp/archives/ar2315/ae531xEnd.h-arc 1.4 10 Dec 2005 10:03:34 lqm $ 2166996 0x2110D4 Unix path: /../ip_qos/src/core/qos_coreAckFirstFifo.c, line 194 2167160 0x211178 Unix path: /../ip_qos/src/core/qos_coreAckFirstFifo.c, line 229 2167274 0x2111EA Unix path: /../ip_qos/src/common/memPool.c, line 32 2167356 0x21123C Unix path: /../ip_qos/src/common/memPool.c, line 40 2167440 0x211290 Unix path: /../ip_qos/src/common/memPool.c, line 63 2167605 0x211335 Unix path: /../ip_qos/src/common/memPool.c, line 67 2167701 0x211395 Unix path: /../ip_qos/src/common/memPool.c, line 68 2167784 0x2113E8 Unix path: /../ip_qos/src/common/memPool.c, line 74 2167868 0x21143C Unix path: /../ip_qos/src/common/memPool.c, line 80 2167954 0x211492 Unix path: /../ip_qos/src/common/memPool.c, line 86 2168038 0x2114E6 Unix path: /../ip_qos/src/common/memPool.c, line 92 2168135 0x211547 Unix path: /../ip_qos/src/common/memPool.c, line 120 2168234 0x2115AA Unix path: /../ip_qos/src/common/memPool.c, line 139 2168331 0x21160B Unix path: /../ip_qos/src/config/qos_Config.c, line 59 2168438 0x211676 Unix path: /../ip_qos/src/config/qos_Config.c, line 68 2168542 0x2116DE Unix path: /../ip_qos/src/config/qos_Config.c, line 89 2168630 0x211736 Unix path: /../ip_qos/src/config/qos_Config.c, line 136 2168716 0x21178C Unix path: /../ip_qos/src/config/qos_Config.c, line 289 2168808 0x2117E8 Unix path: /../ip_qos/src/config/qos_Config.c, line 366 2168896 0x211840 Unix path: /../ip_qos/src/config/qos_Config.c, line 394 2168984 0x211898 Unix path: /../ip_qos/src/config/qos_Config.c, line 418 2169173 0x211955 Unix path: /../ip_qos/src/config/qos_htbConfig.c, line 262 2169296 0x2119D0 Unix path: /../ip_qos/src/config/qos_htbConfig.c, line 328 2169705 0x211B69 Unix path: /../ip_qos/src/config/qos_htbDump.c, line 184 2169805 0x211BCD Unix path: /../ip_qos/src/config/qos_htbDump.c, line 187 2169957 0x211C65 Unix path: /../ip_qos/src/config/qos_htbDump.c, line 208 2170171 0x211D3B Unix path: /../ip_qos/src/config/qos_htbDump.c, line 221 2170260 0x211D94 Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 62 2170344 0x211DE8 Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 87 2170428 0x211E3C Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 118 2170512 0x211E90 Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 169 2170644 0x211F14 Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 117 2170732 0x211F6C Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 146 2170859 0x211FEB Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 192 2170972 0x21205C Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 199 2171071 0x2120BF Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 205 2171173 0x212125 Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 206 2171271 0x212187 Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 213 2171371 0x2121EB Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 217 2171459 0x212243 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 237 2171533 0x21228D Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1414 2171648 0x212300 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1669 2171737 0x212359 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1683 2171958 0x212436 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2527 2172160 0x212500 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2728 2172263 0x212567 Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2732 2172374 0x2125D6 Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 33 2172467 0x212633 Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 34 2172555 0x21268B Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 48 2172652 0x2126EC Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 49 2172739 0x212743 Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 66 2172852 0x2127B4 Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 67 2172939 0x21280B Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 138 2173063 0x212887 Unix path: /../ip_qos/src/common/qos_map.c, line 24 2173147 0x2128DB Unix path: /../ip_qos/src/common/qos_map.c, line 27 2173231 0x21292F Unix path: /../ip_qos/src/common/qos_map.c, line 43 2173313 0x212981 Unix path: /../ip_qos/src/common/qos_map.c, line 53 2173398 0x2129D6 Unix path: /../ip_qos/src/common/qos_map.c, line 80 2173480 0x212A28 Unix path: /../ip_qos/src/common/qos_map.c, line 82 2173572 0x212A84 Unix path: /../ip_qos/src/common/qos_map.c, line 98 2174160 0x212CD0 VxWorks operating system version "5.5.1" , compiled: "Sep 4 2008, 17:18:51" 2191631 0x21710F HTML document footer [..] [cut for brevity. What followed here were a lot of HTML document footers] [..] 2556403 0x2701F3 Copyright string: "Copyright 1999, Mark Martinec. Frontier Artistic License applies." 2558288 0x270950 XML document, version: "1.0" 2561036 0x27140C XML document, version: "1.0" 2561868 0x27174C XML document, version: "1.0" 2563832 0x271EF8 XML document, version: "1.0" 2575992 0x274E78 Base64 standard index table 2576304 0x274FB0 XML document, version: "1.0" 2580992 0x276200 Base64 standard index table 2661593 0x289CD9 Copyright string: "Copyright 1984-2002 Wind River Systems, Inc." 2666394 0x28AF9A VxWorks WIND kernel version "2.6"
有很多HTML / GIF / XMLs / etc,基本都是Web文件。如果我们多做一些grep,我们也会找到对HTML文件的引用,这些HTML文件是调用Web GUI可用的每个函数所需的:
/userRpm/FirmwareUpdateTemp.htm /userRpm/ConfUpdateTemp.htm /userRpm/MenuRpm.htm /userRpm/MainRpm.htm /userRpm/StatusRpm.htm /userRpm/StatusHelpRpm.htm /userRpm/WzdStartRpm.htm /userRpm/WzdOpModeRpm.htm /userRpm/WzdWanTypeRpm.htm /userRpm/WzdStaticIpRpm.htm /userRpm/WzdDynaIpRpm.htm /userRpm/WzdPPPoERpm.htm /userRpm/WzdEndRpm.htm /userRpm/WzdStaticIpHelpRpm.htm /userRpm/WzdStartHelpRpm.htm /userRpm/WzdOpModeHelpRpm.htm /userRpm/WzdWanTypeHelpRpm.htm /userRpm/WzdPPPoEHelpRpm.htm /userRpm/WzdFinishHelpRpm.htm /userRpm/WzdWlanRpm.htm /userRpm/WzdWlanHelpRpm.htm /userRpm/NatDebugRpm26525557.htm /userRpm/NetworkCfgRpm.htm /userRpm/WanStaticIpCfgRpm.htm /userRpm/WanDynamicIpCfgRpm.htm /userRpm/WanCfgRpm.htm /userRpm/PPPoECfgRpm.htm /userRpm/PPPoECfgAdvRpm.htm /userRpm/MacCloneCfgRpm.htm /userRpm/WanBpaCfgRpm.htm /userRpm/WanBpaCfgHelpRpm.htm /userRpm/L2TPCfgRpm.htm /userRpm/L2tpCfgHelpRpm.htm /userRpm/PPTPCfgRpm.htm /userRpm/PptpCfgHelpRpm.htm /userRpm/NetworkCfgHelpRpm.htm /userRpm/WanStaticIpCfgHelpRpm.htm /userRpm/WanDynamicIpCfgHelpRpm.htm /userRpm/PPPoECfgHelpRpm.htm /userRpm/MacCloneCfgHelpRpm.htm /userRpm/WanStaticIpCfgRpm_8021X.htm /userRpm/WanDynamicIpCfgRpm_8021X.htm ...
另外,通过查看字符串,我们可以得出与登录有关的有趣信息:
这个Hello123World字符串,显然就是PPPoE服务登录的密码。
到目前为止,我们发现的信息都比较有用,但是二进制文件在哪里?没有发现代码,也没有其他压缩流中包含它们。此时,我在想,如果此Zlib未压缩流仅包含Web内容,则如何在路由器中更新二进制文件?有时,物联网供应商有时会为其设备发布两种类型的固件,一种包含Web内容,另一种包含二进制文件的固件文件。情况并非如此,但是例如在IP摄像机中会发生这种情况。
为了确保没有丢失其他数据,我检查了该设备的旧固件文件,但结果是相同的结构,只有一个包含Web内容的Zlib压缩流。此时,我在想,也许是因为在处理专有操作系统时,固件文件不包括某些部分,可能是固件更新文件中缺少引导加载程序。但是,必须存在其他内容(例如文件系统),因此也应该存在一些二进制代码。这些二进制文件是否以某种方式被压缩,加密或混淆?
我再次使用Binwalk进行了快速检查,以查看是否可以在未压缩的流中找到任何代码。Binwalk有 -Y 参数:
尝试使用顶点分解器识别文件中包含的可执行代码的CPU体系结构
结果如下:
fastix@bulin:~/wr543g/_wr543gv2-en-up.bin.extracted$ binwalk -Y 54B5 DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 MIPS executable code, 32/64-bit, big endian, at least 1250 valid instructions
从偏移量0开始存在一些MIPS代码(大端)。
到目前为止,我们已经将一些Web内容与一些MIPS代码混合在一起。这并不奇怪,嵌入式设备通常实现充当不同服务器(HTTP,FTP)并具有嵌入式数据的单个二进制文件。
然后,我尝试将未压缩的流加载到IDA中,选择了MIPS big endian [mipsb]处理器类型,IDA立即显示一个新窗口,要求我提供一些数据来加载文件:
由于没有任何内容,我接受了默认值,并显示了另一个警告:
我们的入口点丢失了,IDA不知道从哪里开始加载文件,让我们尝试反汇编第一个字节:
很好,IDA能够识别一个函数,并且一些代码显示在我们的反汇编窗口中。但是,似乎仅用:P对文件进行逆向将是一项艰巨的工作。显然,我们必须更深入地研究并找到加载文件的入口点。
有趣的是要注意一件事:地址0x802A3960被移到$ gp寄存器中。该寄存器是一个全局指针,指向包含常量和全局变量的堆中64K内存块的中间,这个地址让我对可以查找的内存范围有了一个了解。
因此,我再次返回到固件分析,试图找到可以帮助我进一步分析的东西,并且发现了两个更有趣的字符串:
两个字符串均为“ OWOW .. ”,但长度不同。第一次出现是16个字节长,而第二次出现是32个字节长。我在文件格式分析方面的经验告诉我,这些字符串可能是一种神奇的字节(文件中某个点的字节,主要是文件的开头,用于标识文件格式,例如:PE,GIF, PNG等)。我在Google上搜索了一下,并在devttys0的博客中找到了很好的参考,这对我的分析很有帮助。在相同的博客文章,还有另一个参考,从IOActive的有关这些签名字节了解更多的细节。
https://ioactive.com/solving-a-little-mystery/
VxWorks MemFS文件系统
根据前面提到的帖子,OWOW ..字符串在MemFS Wind River管理文件系统中用作签名。根据IOactive的博客文章,该字符串可能在固件中找到两次。我将引用以下段落:
the first one due to the .h where it is defined (close to other strings such as the webserver banner )and the second one already as part of the MemFS.
首先,devttys0 提供了以下 header 结构:
http://www.devttys0.com/2011/06/mystery-file-system/ struct owfs_header { char magic[32]; // 'OWOWOWOWOWOW...' uint32_t version; // version #1 uint32_t file_count; uint32_t unknown; // ?? }
OWFS在devttys0上命名时,并知道这个文件系统被 MemFS 调用。
此定义与我的定义不匹配:
如你所见,file entries之前只有两个DWORDS,我回到另一篇文章,发现第三个字段是可选的。然后,在我的情况下,struct如下所示:
struct owfs_header { char magic[32]; // 'OWOWOWOWOWOW...' uint32_t version; // version #1 uint32_t file_count; // 16 files array filenames_plus_eof[file_count]; }
IOActive的博客文章中提到的标志字段对我的固件文件没有意义。固件签名后的文件列表包含0x10条目,每个条目的最大长度为0x4C字节,其中文件名保留0x40字节,文件大小保留4个字节,文件偏移量保留4个字节(从文件系统标头的开头),未知字段保留4个字节(空)在所有情况下)。有趣的是,列表中的所有文件都是纯文本,这意味着该标志字段(在我的情况下为1)不代表压缩/未压缩选项。看起来更像是版本字段,或者以相反的方式使用值,这意味着1 =普通,2 =压缩。
在我的情况下,文件入口struct 如下所示:
struct FILE_ENTRY_HEADER { char filename[0x40]; uint32_t file_size; uint32_t file_offset; uint32_t reserved; // always 0 }
它与devttys0帖子中的定义几乎相同,只是最后一个字段始终等于null,struct的大小似乎取决于设备/固件。
有了所有这些信息,我就能够编写一个Python脚本来从MemFS文件系统中提取文件:
https://blog.quarkslab.com/resources/2020-05-07_reverse_engineering_a_vxworks_os_based_router/code/extract_files.py C:\Users\itsevart\Documents\reversing-tp-link-wr543g\code>python extract_files.py ..\bin\54B5 [+] Extracting files from ..\bin\54B5 [+] Searching signature.. [+] Signature found at offset: 1dd1c0 [+] SIGNATURE: OWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOW [+] Flag: 0x00000001 [+] File count: 16 [+] Reading file entries.. >> Entry no 0 [+] filename: /rc_filesys/doc/dynaform/common.js [+] file size: 915 bytes [+] file offset: 0x000004e8 >> Entry no 1 [+] filename: /rc_filesys/doc/dynaform/css_help.css [+] file size: 627 bytes [+] file offset: 0x0000087c >> Entry no 2 [+] filename: /rc_filesys/doc/dynaform/css_main.css [+] file size: 2063 bytes [+] file offset: 0x00000af0 >> Entry no 3 [+] filename: /rc_filesys/doc/frames/top.htm [+] file size: 1763 bytes [+] file offset: 0x00001300 >> Entry no 4 [+] filename: /rc_filesys/doc/images/blue.gif [+] file size: 62 bytes [+] file offset: 0x000019e4 >> Entry no 5 [+] filename: /rc_filesys/doc/dynaform/commonfuncsEn1.js [+] file size: 3675 bytes [+] file offset: 0x00001a24 >> Entry no 6 [+] filename: /rc_filesys/doc/dynaform/commonfuncsEn3.js [+] file size: 3648 bytes [+] file offset: 0x00002880 >> Entry no 7 [+] filename: /rc_filesys/doc/images/helpPic.gif [+] file size: 5515 bytes [+] file offset: 0x000036c0 >> Entry no 8 [+] filename: /rc_filesys/doc/images/minus.gif [+] file size: 59 bytes [+] file offset: 0x00004c4c >> Entry no 9 [+] filename: /rc_filesys/doc/images/plus.gif [+] file size: 63 bytes [+] file offset: 0x00004c88 >> Entry no 10 [+] filename: /rc_filesys/doc/images/productphoto.gif [+] file size: 4634 bytes [+] file offset: 0x00004cc8 >> Entry no 11 [+] filename: /rc_filesys/doc/images/pw.gif [+] file size: 60 bytes [+] file offset: 0x00005ee4 >> Entry no 12 [+] filename: /rc_filesys/doc/images/top1_1.jpg [+] file size: 4076 bytes [+] file offset: 0x00005f20 >> Entry no 13 [+] filename: /rc_filesys/doc/images/top1_2.jpg [+] file size: 9790 bytes [+] file offset: 0x00006f0c >> Entry no 14 [+] filename: /rc_filesys/doc/images/top2.jpg [+] file size: 1221 bytes [+] file offset: 0x0000954c >> Entry no 15 [+] filename: /rc_filesys/doc/images/top_bg.jpg [+] file size: 289 bytes [+] file offset: 0x00009a14
即使我能够提取几个文件(总共16个),我仍然认为文件很少。实际上,我展示了更多对.htm文件的引用。我开始进行更多搜索,并注意到固件数据中散布着许多文件,这些文件到目前为止没有遵循任何结构,也没有包含任何特定的标头。其中一些文件包含页脚,但没有页眉。我开始查看第一个签名出现的地方,并注意到有一种表格:
不幸的是,我无法在该表与分散的文件内容之间找到联系。
我发现Firmware Mod Kit对IOActive的帖子和devttys0的帖子中提到的MemFS文件系统使用了相同的标头结构,但是,这并不完全是我在处理的固件的情况。
用 IDA 加载二进制文件
提取文件后,我需要找出一种继续分析的方法,因为获取的文件不太有用,而且我确定里面还有更多文件。它们可能不是完整版本的文件,而是由某些各自的服务(HTTP,FTP等;)处理的文件,这是一种独立的服务器,用于处理不同类型的协议并发送文件。
我需要一种方法来将提取的数据加载到IDA中并获取所有函数,字符串,符号等。为了做更广泛的分析,我需要完成的主要目标是找到用于加载二进制文件的基址。
http://www.devttys0.com/2011/07/reverse-engineering-vxworks-firmware-wrt54gv8/ https://cq674350529.github.io/2018/09/19/TP-Link-wr886v6-%E5%9B%BA%E4%BB%B6%E8%A7%A3%E6%9E%90/
在devttys0博客中的帖子中,作者通过分析提取的MIPS二进制文件以及从IDA固件中提取的符号来获得基址。该二进制文件负责加载和解压缩位于固件某些部分的LZMA流,代码中明确引用了加载解压缩流的基址。还提到了该地址用Internet上的某些代码可以获取:
因此,似乎我们之前提取的LZMA数据确实包含可执行代码,并且已将其解压缩并加载到地址为0x80001000的内存中。Google在搜索“ vxworks lzmadecode”时发现了一些可以证实这一结论的源代码。
引用的链接对我不起作用。我再次进行了快速搜索,发现使用该地址的LZMA解码器只有一个引用。
http://www.hackchina.com/en/cont/27807
在cq674350529的帖子中,加载二进制文件的基地址是从Binwalk提供的输出中获得的,在固件文件中找到一个U-Boot标头,其中包含对入口点地址的引用,该入口点地址是IDA中用作基址的地址。
这两种方法对我的情况都不太适用,没有找到 U-Boot头,也没有其他二进制文件可分析,基址不需要在固件数据中,因为它可能在引导加载程序中进行了硬编码。解压缩数据所需的所有代码都在设备上,在两个帖子中都有一个地址,即基地址:0x80001000。让我们尝试一下:
结果如下:
反汇编窗口中单击C创建代码后,IDA开始使用自动分析,并发现了许多函数。现在,可以看到其中的一些字符串 在代码中引用了块作为文件:
我现在能够对二进制文件进行逆向,但是,即使有一些字符串外部参照,也没有任何符号。在这种情况下 cq674350529的文章中,符号分散在固件文件中,并且作者需要编写脚本来编译符号表,因为IDA不能通过自动分析来完成。但是,我没有任何已知的VxWorks符号。
无论如何,通过使用字符串外部参照和数字常量,可以对工程进行逆向和重命名。例如,我发现以下字符串xref 错误:MD4Update MD已经完成。该字符串属于 MD4消息摘要算法的实现。通过搜索初始化常量,可以找到源代码中引用的一些函数:
#define I0 0x67452301 /* Initial values for MD buffer */ #define I1 0xefcdab89 #define I2 0x98badcfe #define I3 0x10325476 #define C2 013240474631 /* round 2 constant = sqrt(2) in octal */ #define C3 015666365641 /* round 3 constant = sqrt(3) in octal */
这是MIPS二进制文件中的相应代码:
lui $a1, 0xEFCD lui $a2, 0x98BA lui $v0, 0x1032 ori $v1, 0x2301 li $a1, 0xEFCDAB89 --> this constant li $a2, 0x98BADCFE --> this one too li $v0, 0x10325476 sw $v0, 0xC($a0) sw $v1, 0($a0) sw $a1, 4($a0) sw $a2, 8($a0) sw $zero, 0x10($a0) jr $ra sw $zero, 0x14($a0)
这是MD4Init()函数,尽管这是逆向没有符号的二进制文件时的一种很好的通用方法,但是要花大量的时间才能找到不错的逆向函数列表。此外,还有一些常见函数,例如printf,memset,memcpy等,可以很容易地识别出来,但有时取决于编译器的优化和在编译过程中使用的标志。因此,我确信有一种更简单的方法可以自动执行识别常用函数的工作。
获取符号
为了自动执行识别常见函数的任务,我使用了由devttys0开发的IDA插件Rizzo,该插件包含使用唯一的字符串引用和其他度量作为可识别的动作(例如内存访问,对常量值的引用和函数调用)制成的模糊签名。但是,该插件有点过时,最后一次更新是在2年前,为了支持IDA 7并且仅支持Python2。我报告了一个问题,@ fuzzywalls(感谢btw)向我发送了他的fork,但是,该fork不适用于我的IDA 7.4(191112)。
https://github.com/devttys0/ida/tree/master/plugins/rizzo
经过一些工作,我终于能够解决所有问题并将其与我的IDA编译和Python 2配合使用。结果如下:
Found 3 formal matches in 0.00 seconds. Found 107 fuzzy matches in 0.00 seconds. Found 188 string matches in 0.00 seconds. Found 40 immediate matches in 0.00 seconds. Renamed 162 functions in 0.54 seconds. Signatures applied in 24.04 seconds Caching 'Functions window'... ok Caching 'Names window'... ok
你可以在这里找到我提供的Rizzo版本:
https://blog.quarkslab.com/resources/2020-05-07_reverse_engineering_a_vxworks_os_based_router/code/rizzo.zip
研究总结
我在Rizzo中获得了一些符号,进行了一段时间的漏洞挖掘,但未成功:(
我开始研究Rizzo能够识别的函数,其中一些函数与DES和MD4有关,对我而言并不太有趣,这些函数属于某些公共实现,例如:MD4消息摘要算法的实现。但是,我猜有一些字符串引用函数与配置文件相关(配置文件可以从路由器的GUI中转储,它以某种方式被加密/混淆):
ROM:801FA99C aApcfgencryptio:.ascii "apCfgEncryptionSet(%d, TRUE) failed\r\n" ROM:801FA9C2 .byte 0 ROM:801FA9C3 .byte 0 ROM:801FA9C4 aIwirelessprivs:.ascii "iWirelessPrivSelect = %d, secSubType[1] = %d\r\n" ROM:801FA9F3 .byte 0 ROM:801FA9F4 aApcfgauthtypes:.ascii "apCfgAuthTypeSet() failed\r\n" ROM:801FAA10 aApcfgcipherset:.ascii "apCfgCipherSet() failed\r\n" ROM:801FAA2A .byte 0 ROM:801FAA2B .byte 0 ROM:801FAA2C aApcfgkeysrcset:.ascii "apCfgKeySrcSet() failed\r\n" ROM:801FAA46 .byte 0 ROM:801FAA47 .byte 0 ROM:801FAA48 aApcfggroupkeyu:.ascii "apCfgGroupKeyUpdateIntervalSet() failed\r\n" ROM:801FAA72 .byte 0 ROM:801FAA73 .byte 0 ROM:801FAA74 aErrorUnableToG:.ascii "ERROR: Unable to generate key with given passphrase and ssid\n" ROM:801FAA74 .ascii ROM:801FAAB2 .byte 0 ROM:801FAAB3 .byte 0 ROM:801FAAB4 aApcfgpassphras:.ascii "apCfgPassphraseSet() failed\r\n" ROM:801FAAD2 .byte 0 ROM:801FAAD3 .byte 0 ROM:801FAAD4 aApcfgpassphras_0:.ascii "apCfgPassphraseKeySet() failed\r\n"
不幸的是,这些字符串没有外部参照。
像下面这样的其他一些代码,将我带到了此处的源代码(显然,它与以太网以及Atheros和VxWorks之间的一种描述符转换有关):
http://read.pudn.com/downloads90/sourcecode/os/343695/vxworks_stp_src/vxbufs.c__.htm http://read.pudn.com/downloads90/sourcecode/os/343695/vxworks_stp_src/vxbufs.c__.htm ROM:801FA5B8 aVxdesctomblkEr:.ascii“ \ n” ROM:801FA5B8 .ascii“ vxDescToMblk:加入mBlk \ n时出错” ROM:801FA5DB .byte 0 ROM:801FA5DC aVxmblktodescMP:.ascii“ vxMblkToDesc:未在第一个mblk上设置M_PKTHDR \ n”
同样,这些字符串没有外部参考,其余函数看起来没什么分析价值(如本文件所示),其中大多数是标准函数或辅助函数,没有危险函数,例如自定义处理程序或类似函数。
我尝试的另一件事是使用Burp Suite,以拦截来自HTTP服务器(设备公开的唯一服务)的某些请求,并尝试以某种方式触发崩溃,例如,修改请求的参数。以下示例是从NTP服务器配置捕获的:
GET /userRpm/DateTimeCfgRpm.htm?timezone=540&month=1&day=1&year=2006&hour=11&minute=59&second=52&ntpA=0.0.0.0&ntpB=0.0.0.0&Submit=Save HTTP/1.1 Host: 192.168.1.1 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-GB,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.1.1/userRpm/DateTimeCfgRpm.htm Authorization: Basic bnJpdmE6SncyWGtEYWpWbG1jaA== Connection: close Upgrade-Insecure-Requests: 1
为了获得一些输出,我在另一侧连接了一个串行设备接口,以捕获可能的输出,但是Windows 10给我USB接口带来了一些麻烦,我遇到了一些与最大电压消耗有关的错误,不得不多次重新启动PC才能继续。
最后,通过进行一些测试并查看二进制文件中的代码,似乎一切都交给了二进制文件(在单个二进制文件中),并且大多数数据都被编码了,服务器以硬编码的数据“块”进行响应,并且任何不符合要求的其他请求都将被丢弃。例如,在更改NTP服务器时,不同的请求(具有不同的参数)将返回相同的回包。
也许设备内部的调试器会很有帮助,完成此任务的一种可能是修改固件并上载自定义GDB服务器。但是,将需要使用VxWorks的编译工具为MIPS编译GDB服务器,它仅针对x86 / x64 / ARM和VxWorks 7有效。
当然,对未知的体系结构进行逆向或处理不常见的OS会带来复杂性,但是有时,即使没有可用的信息,也可能会取得一些进展并完成工作。在这种特殊情况下,有可能要感谢一些过去发现类似问题并记录了该过程的人。
由于这一点,我能够对路由器中使用的未知文件系统进行逆向,并熟悉操作系统。找到一个漏洞本来很好,但是我现在并还没有太多发现。开始能够访问shell程序或将工具上载到路由器以对其进行调试,对于评估其安全性和寻找其漏洞确实是一大步,而且还需要做更多的工作!
无论如何,我希望分享的经验对其他人有用。
VxWorks 相关工具
如果你想了解有关VxWorks的更多详细信息,下面的资料可能会用得到:
· Digging Inside VxWorks (OS + Firmware) - The Holistic Security
· 44CON London - Attacking VxWorks: from Stone Age to Interstellar
· Shiny Old VxWorks Vulnerabilities
· Dive into VxWorks Based IoT Device Debug the Undebugable Device
· https://www.cnblogs.com/hac425/p/9706815.html
Tools:
· Tools for working with TP-LINK VxWorks-based router firmware
本文翻译自:https://blog.quarkslab.com/reverse-engineering-a-vxworks-os-based-router.html如若转载,请注明原文地址: