[工控安全][原創]某PLC設備CPU模塊固件逆向分析(一)

某PLC設備CPU模塊固件逆向分析(一)

mailto:wangkai0351@gmail.comhtml

【未經贊成禁止轉載】架構

[1]感謝燈塔實驗室技術專家於2015年撰寫的技術文章《施耐德PLC以太網模塊固件後門引起的血案》tcp

https://mp.weixin.qq.com/s?__biz=MzA5OTMwMzY1NQ==&mid=207033762&idx=1&sn=e629b1db9f43937cba6d5707c707450d&scene=23&srcid=11052lU6PwhrrCHsh1r5goGp#rd函數

https://mp.weixin.qq.com/s?__biz=MzA5OTMwMzY1NQ==&mid=207094710&idx=1&sn=13fc594d15729bd7e001a48b90d827c4&mpshare=1&scene=1&srcid=0127j51fr0di9oxfYbQm1o0X#rd工具

[2]感謝威努特公司的技術專家於2018年撰寫的技術文章《工控漏洞挖掘方法之固件逆向分析》操作系統

https://paper.seebug.org/613/code

[3]感謝平安科技銀河實驗室和支付寶光年實驗室的技術專家於2018年發佈的針對VxWorks設備的分析工具VxHunterhtm

https://www.4hou.com/info/17114.htmlblog

[4]感謝平安科技銀河實驗室的技術專家於2019年撰寫的技術文章《基於 VxWorks 的嵌入式設備固件分析方法介紹》ip

https://paper.seebug.org/771/

正文

1.固件文件獲取

本固件文件的獲取方式是從廠家官網得到的,不須要註冊用戶賬戶,不須要贊成任何用戶協議。

2.固件原始文件解包

下載的固件文件是一個壓縮包,解壓後獲得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模塊固件是包含函數名錶的。

3.逆向反彙編

3.1 肯定加載偏移地址

3.2 拖進IDA pro

3.3 修復符號表

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個函數也就不是表()中對應的函數,本次匹配宣告失敗,可是,咱們編寫程序自動實現循環匹配,看有沒有能匹配上的(若是函符號表對應沒有問題,那麼最後確定是能夠匹配成功的)。

4.看幾個已經有cve的函數

這些

詳細內容稍後奉上。 本版本中的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

相關文章
相關標籤/搜索