分享一個(gè)通過(guò)STM32的bin文件逆向分析代碼的工具
首先你要有一個(gè)bin文件(bin文件的獲取方法不在此展開(kāi)介紹,今后有機(jī)會(huì)可以專(zhuān)門(mén)開(kāi)一個(gè)貼聊一聊)。本次實(shí)驗(yàn)用到的bin文件 stm32_xwrtos.bin.zip?(6 KB) 是用ST官方CMSIS和外設(shè)庫(kù)編譯的跑在stm32f103c8t6上的bin文件,比較具有代表性。
燒錄文件下載
工具準(zhǔn)備:
安裝開(kāi)源跨平臺(tái)逆向神器r2:
r2可運(yùn)行在Windows、Linux、Mac等所有主流操作系統(tǒng)上(r2有多牛逼不在此展開(kāi)介紹,今后有機(jī)會(huì)可以專(zhuān)門(mén)開(kāi)一個(gè)貼聊一聊)。
實(shí)驗(yàn)步驟:
1)輸入r2 -a arm -b 16 -m 0x08000000 stm32_xwrtos.bin 進(jìn)入r2的控制臺(tái)后,輸入e asm.cpu=cortex。這一步是告訴r2以0x08000000為基址加載stm32_xwrtos.bin文件,并設(shè)置指令集為cortex系列的thumb。
2)輸入aaaa,運(yùn)行自動(dòng)化分析。
3)輸入pxw 268 @0x08000000 以小端四字節(jié)形式打印從0x08000000開(kāi)始的268(268對(duì)應(yīng)中斷向量表大小)個(gè)字節(jié),同時(shí)打開(kāi)ST官方的啟動(dòng)文件startup_stm32f10x_md.s并找到.isr_vector段進(jìn)行對(duì)照。
4)接著上一步,輸入fs notes,創(chuàng)建并切換到一個(gè)名為notes(可以是任意其他名字)的符號(hào)記事本;按照f(shuō) flag=address的形式,對(duì)照.isr_vector段,向符號(hào)記事本中錄入感興趣的符號(hào)地址對(duì)應(yīng)關(guān)系。注意如果address是函數(shù)地址則需要減1(因?yàn)閠humb指令的要求,具體原因此處不展開(kāi));最后輸入af @flag形式的命令強(qiáng)制進(jìn)行函數(shù)分析。
5) 輸入pdf @Reset_Handler,對(duì)Reset_Handler函數(shù)進(jìn)行反匯編
輸入 VV 切換到流程圖視圖
通過(guò)閱讀匯編代碼,可以得到以下信息:
1.??data段的地址區(qū)間為0x20000000-0x20000028 bss段的地址區(qū)間為0x20000028-0x2000043C
2.??Reset_Handler用0x08002cbc開(kāi)始的0x28字節(jié)初始化data段,用0填充bss段
3. 調(diào)用fcn.08001cc8函數(shù) 4. 調(diào)用fcn.08001734函數(shù)6)輸入pdf @fcn.08001cc8進(jìn)行反匯編
發(fā)現(xiàn)對(duì)外設(shè)寄存器地址0x40021000的引用
通過(guò)查詢(xún)數(shù)據(jù)手冊(cè),可判斷fcn.08001cc8函數(shù)應(yīng)為系統(tǒng)初始化化函數(shù)SystemInit(),它初始化了時(shí)鐘。
7)根據(jù)經(jīng)驗(yàn)判斷fcn.0800173函數(shù)即為main函數(shù)
本篇主要作用是帶大家熟悉和習(xí)慣r2的基本使用,以及對(duì)逆向有個(gè)感性認(rèn)識(shí)。后面有機(jī)會(huì)再給大家講述在逆向的基礎(chǔ)上介紹stm32上的棧溢出漏洞的挖掘與利用。
再次感謝ilovepp兄分享的精彩文章!
長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!