免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
STM32 & RT-Thread的逆向入門
backahasten@0xFA

                現(xiàn)在,各種MCU的價(jià)格越來(lái)越低,同等條件下能買到的ROM和RAM資源也多了。對(duì)一些復(fù)雜邏輯的應(yīng)用,相比于花費(fèi)大量的時(shí)間去扣底層還不如使用操作系統(tǒng)加快開(kāi)發(fā)速度,使用了操作系統(tǒng)之后,針對(duì)固件的逆向會(huì)比無(wú)os的固件逆向有一些不同。

                RT-Thread是國(guó)產(chǎn)實(shí)時(shí)操作系統(tǒng)的典范,我個(gè)人的特別喜歡。RT-Thread有很多的BSP可以適配眾多的芯片和架構(gòu),在本文還是使用最常見(jiàn)的stm32來(lái)進(jìn)行介紹。

                硬件上我是用了正點(diǎn)原子核RT-Thread聯(lián)合開(kāi)發(fā)的潘多拉開(kāi)發(fā)板,在本文中沒(méi)有使用潘多拉的硬件,我比較偷懶的使用了開(kāi)發(fā)板配套的例子去做逆向。

啟動(dòng)

                我一直相信一句話,不會(huì)開(kāi)發(fā)也就不會(huì)安全,開(kāi)發(fā)能力決定著安全能力的天花板。在逆向STM32 & RT-Thread的過(guò)程中也是這個(gè)樣子的。我們打開(kāi)一個(gè)bin文件,第一件事就是找到main函數(shù),這個(gè)main函數(shù)并不是stm32的main函數(shù)而是操作系統(tǒng)的main函數(shù)。例如在stm32 & keil開(kāi)發(fā)中,RT-Thread使用$Sub$$main調(diào)用初始化操作系統(tǒng),如果是不帶操作系統(tǒng)的裸開(kāi)發(fā),這個(gè)函數(shù)就是邏輯的main函數(shù)了。

                詳細(xì)的啟動(dòng)過(guò)程可以在https://www.rt-thread.org/document/site/tutorial/quick-start/stm32f103-simulator/stm32f103-simulator/中找到,為了本文的完整,我們復(fù)制過(guò)來(lái)一些代碼。

//components.c 中定義/* re-define main function */int $Sub$$main(void){    rt_hw_interrupt_disable();    rtthread_startup();    return 0;}

這里面調(diào)用了兩個(gè)函數(shù),第一個(gè)函數(shù)關(guān)閉了中斷,開(kāi)始初始化操作系統(tǒng)。

int rtthread_startup(void){    rt_hw_interrupt_disable();    /* board level initalization     * NOTE: please initialize heap inside board initialization.     */    rt_hw_board_init();    /* show RT-Thread version */    rt_show_version();    /* timer system initialization */    rt_system_timer_init();    /* scheduler system initialization */    rt_system_scheduler_init();#ifdef RT_USING_SIGNALS    /* signal system initialization */    rt_system_signal_init();#endif    /* create init_thread */    rt_application_init();    /* timer thread initialization */    rt_system_timer_thread_init();    /* idle thread initialization */    rt_thread_idle_init();    /* start scheduler */    rt_system_scheduler_start();    /* never reach here */    return 0;}

rtthread_startup();函數(shù)中,進(jìn)行各個(gè)組件的初始化,其他我們不用管,重點(diǎn)看其中的rt_application_init();函數(shù),這個(gè)函數(shù)用于線程任務(wù)的初始化,在其中,我們就可以脫離操作系統(tǒng)代碼的范疇,進(jìn)入到真正的邏輯代碼的位置。

操作

                我們使用潘多拉開(kāi)發(fā)板的例子29_iot_web_server,這個(gè)例子復(fù)雜程度中等,可以充分的分析各個(gè)點(diǎn)。keil編譯之后,會(huì)的帶axf文件和Hex文件,其中axf帶有符號(hào)表,而hex文件只有基礎(chǔ)的組織結(jié)構(gòu),由于嵌入式的特點(diǎn),為了節(jié)約資源,燒錄進(jìn)芯片里的固件基本都不會(huì)帶符號(hào)表。為了仿造真實(shí)情況下拿到的固件,我們使用jlink的工具打開(kāi)hex文件之后保存成bin文件。之后使用ida pro打開(kāi)。

                打開(kāi)文件之后,正確載入逆向,顯示如下:(使用IDA PRO逆向ARM M核心的方法請(qǐng)參考我之前的文章
<ignore_js_op>

選中的地址 0x8000495為芯片的上電PC載入地址,找到地址之后,如下:
<ignore_js_op>

由于最開(kāi)始是硬件PC設(shè)置,沒(méi)有軟件引用關(guān)系,ida pro沒(méi)有識(shí)別,在0x8000494處按C,進(jìn)行反匯編:

<ignore_js_op>

發(fā)現(xiàn)可以看到stm32的啟動(dòng)代碼,進(jìn)入函數(shù)0x800188:

<ignore_js_op>

發(fā)現(xiàn)0x800018C處的函數(shù)沒(méi)有識(shí)別,依舊按C:
<ignore_js_op>

發(fā)現(xiàn)識(shí)別出來(lái)一個(gè)函數(shù)的跳轉(zhuǎn),繼續(xù)跟蹤,進(jìn)入:

<ignore_js_op>

發(fā)現(xiàn)有四個(gè)函數(shù),具體函數(shù)的意義是什么,沒(méi)有符號(hào)表不得而知。

這里介紹一個(gè)小技巧,我們現(xiàn)在處于上帝模式,我們有axf文件,axf文件中有符號(hào)表,并且,這一段程序在操作系統(tǒng)中,所有的stm32都是一樣的,我們現(xiàn)在反匯編axf文件,與bin文件互相參照,可以更好的分析啟動(dòng)過(guò)程。打開(kāi)axf文件,找到位置:
<ignore_js_op>

選中的函數(shù),也就是第二個(gè)函數(shù),是有關(guān)操作系統(tǒng)線程的設(shè)置,選擇進(jìn)入:
<ignore_js_op>

發(fā)現(xiàn)又是一堆函數(shù),我們依舊參考axf文件:

<ignore_js_op>

第六個(gè)函數(shù)跳轉(zhuǎn)是任務(wù)的設(shè)置,選擇進(jìn)入:

<ignore_js_op>

在這里我們可以發(fā)現(xiàn)任務(wù)main函數(shù)的設(shè)置,進(jìn)入函數(shù)0x802485C
<ignore_js_op>


還有兩個(gè)函數(shù),參考一下axf: <ignore_js_op>

上面的是任務(wù)進(jìn)入的設(shè)置,下面是main函數(shù)的邏輯,進(jìn)入main函數(shù):
<ignore_js_op>

按F5轉(zhuǎn)變成偽代碼:
<ignore_js_op>

這就是任務(wù)main函數(shù)的邏輯,接下來(lái)就可以進(jìn)行下一步的分析了。

實(shí)際上,還有另外一個(gè)方法,直接搜索字符串main:

<ignore_js_op>

同樣可以找到main函數(shù)的位置。但是由于任務(wù)名稱可能修改,從啟動(dòng)代碼 逐步分析是最可靠的方法。

沒(méi)有符號(hào)表依然很難受,我在那篇文章中也介紹了恢復(fù)符號(hào)表的方法,有需要大家可以參考。

來(lái)源:https://www.icode9.com/content-4-498901.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【周四RTOS專欄】一個(gè)美女程序員的μCOS-Ⅱ到RT-Thread移植筆記?
STM32固件逆向
STM32F103 RTT從零開(kāi)始(二)——RTT系統(tǒng)中點(diǎn)亮LED
國(guó)產(chǎn)開(kāi)源實(shí)時(shí)線程操作系統(tǒng) 0.3.0 RC1發(fā)布
從菜鳥(niǎo)到高手,學(xué)習(xí)arm32位單片機(jī)的必經(jīng)之路,給大家分享個(gè)人經(jīng)驗(yàn)!
RT-Thread操作系統(tǒng)及STM32F4xx體系結(jié)構(gòu)詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服