mailto:wangkai0351@gmail.comhtml
【未經贊成禁止轉載】架構
[1]感謝燈塔實驗室技術專家於2015年撰寫的技術文章《施耐德PLC以太網模塊固件後門引起的血案》tcp
[2]感謝威努特公司的技術專家於2018年撰寫的技術文章《工控漏洞挖掘方法之固件逆向分析》操作系統
https://paper.seebug.org/613/code
[3]感謝平安科技銀河實驗室和支付寶光年實驗室的技術專家於2018年發佈的針對VxWorks設備的分析工具VxHunterhtm
https://www.4hou.com/info/17114.htmlblog
[4]感謝平安科技銀河實驗室的技術專家於2019年撰寫的技術文章《基於 VxWorks 的嵌入式設備固件分析方法介紹》ip
本固件文件的獲取方式是從廠家官網得到的,不須要註冊用戶賬戶,不須要贊成任何用戶協議。
下載的固件文件是一個壓縮包,解壓後獲得A.bin文件。
使用binwalk分析A.bin文件。
信息蒐集:
a)該PLC CPU模塊的主控芯片架構是ARM920,芯片型號是ATMEL AT91RM9200。
b)該PLC CPU模塊固件的操做系統是VxWorks,其中,
VxWorks WIND kernel version = 2.10
VxWorks operating system version = 6.4。
更詳細的版本號參考結構體逆向後結果
struct vxWorksVersion{
vxWorksVersionMaint
vxWorksVersionMajor
vxWorksVersionMinor}
c)該PLC CPU模塊固件是包含函數名錶的。
0x05 | 函數名 |
0x07 | |
0x09 |
總結上圖中出現過的兩類地址,羅列到下表,同時考慮是小端存儲(地址大的數據在前),轉換成大端(方便人看)。
符號字符串所在的絕對存儲地址 | 大端(0x) | 符號所在的存儲地址 | 大端(0x) |
---|---|---|---|
20 67 34 20 | 20346720 | 30 dc 17 20 | 2017dc30 |
2c 67 34 20 | 2034672c | 3c c2 15 20 | 2015c23c |
48 67 34 20 | 20346748 | 64 c4 15 20 | 2015c464 |
58 67 34 20 | 20346758 | a8 c4 15 20 | 2015c4a8 |
6c 67 34 20 | 2034676c | ec c4 15 20 | 2015c4ec |
下面的任務有兩個,依次是
1)計算加載地址(偏移地址)
$$
加載地址 = 符號表中字符串的絕對地址 - 相應字符串在固件中的偏移
$$
2)修復函數名錶
咱們先解決第一個問題,咱們有不少種方法去逆向推斷出來加載地址(偏移地址)。我我的比較推崇的是,由表及裏的逆向推斷方法,從加載地址的定義概念出發。
由上表能夠延伸一下
函數字符串編號 | 函數名字符串的絕對存儲地址(大端0x) | 絕對存儲地址誤差(0x) | |
---|---|---|---|
1 | 20346720 | —— | |
2 | 2034672c | 2034672c-20346720=c | |
3 | 20346748 | 20346748-2034672c=28 | |
4 | 20346758 | 20346758-20346748=10 | |
5 | 2034676c | 2034676c-20346758=14 |
由於
函數名字符串N+1的絕對存儲地址-函數名字符串N的絕對存儲地址=函數名字符串N+1的相對存儲地址-函數名字符串N的相對存儲地址
所以,咱們就尋找連續的5個函數名字符串,使得其相對存儲地址誤差等於上表羅列的絕對存儲地址誤差。
參考如下的函數名相對存儲地址示例
00390310 73 74 72 63 68 72 00 00 73 74 72 63 6d 70 00 00 |strchr..strcmp..| 00390320 73 74 72 63 6d 70 63 69 00 00 00 00 73 74 72 63 |strcmpci....strc| 00390330 6f 6c 6c 00 73 74 72 63 70 79 00 00 73 74 72 63 |oll.strcpy..strc| 00390340 73 70 6e 00 73 74 72 65 72 72 6f 72 5f 72 00 00 |spn.strerror_r..| 00390350 73 74 72 46 72 65 65 00 73 74 72 66 74 69 6d 65 |strFree.strftime|
能夠看出,存儲函數名的時候有對齊規則。
函數字符串編號 | 函數名 | 函數名字符串的相對存儲地址(0x) | 相對存儲地址誤差(0x) |
---|---|---|---|
1 | strchr | 00390310 | |
2 | strcmp | 00390318 | 00390318-00390310=8 |
3 | strcmpci | 00390320 | 00390320-00390318=8 |
4 | strcoll | 0039032c | 0039032c-00390320=c |
5 | strcpy | 00390334 | 00390334-0039032c=8 |
從上表看出,這5個函數的相對存儲地址誤差和表()中絕對存儲地址誤差對不上,所以,這5個函數也就不是表()中對應的函數,本次匹配宣告失敗,可是,咱們編寫程序自動實現循環匹配,看有沒有能匹配上的(若是函符號表對應沒有問題,那麼最後確定是能夠匹配成功的)。
這些
詳細內容稍後奉上。 本版本中的tcp/ip協議棧並非IPNET協議棧,所以不受URGENT/11的影響。具體說明,本設備的vxworks OS中使用的是BSD的tcp/ip協議棧,system call的API以下。 bsdAccept bsdConnect bsdConnectWithTimeout bsdGetpeername bsdGetsockname bsdGetsockopt bsdRecv bsdRecvfrom bsdRecvmsg bsdSend bsdSendmsg bsdSendto bsdSetsockopt bsdShutdown bsdSockDefaultConfigParams bsdSockFunc bsdSockInstInit bsdSockLibInit bsdZbufSockRtn