乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      STM32 & RT-Thread的逆向入門

       印度阿三17 2019-10-10
      backahasten@0xFA

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

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

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

      啟動

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

                      詳細的啟動過程可以在https://www./document/site/tutorial/quick-start/stm32f103-simulator/stm32f103-simulator/中找到,為了本文的完整,我們復(fù)制過來一些代碼。

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

      這里面調(diào)用了兩個函數(shù),第一個函數(shù)關(guān)閉了中斷,開始初始化操作系統(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ù)中,進行各個組件的初始化,其他我們不用管,重點看其中的rt_application_init();函數(shù),這個函數(shù)用于線程任務(wù)的初始化,在其中,我們就可以脫離操作系統(tǒng)代碼的范疇,進入到真正的邏輯代碼的位置。

      操作

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

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

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

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

      <ignore_js_op>

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

      <ignore_js_op>

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

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

      <ignore_js_op>

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

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

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

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

      <ignore_js_op>

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

      <ignore_js_op>

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


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

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

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

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

      實際上,還有另外一個方法,直接搜索字符串main:

      <ignore_js_op>

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

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

      來源:https://www./content-4-498901.html

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多