日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32逆向入门

發(fā)布時間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32逆向入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接:

stm32逆向入門_合天網(wǎng)安實驗室的博客-CSDN博客

關(guān)注我們

一、前言
本日學(xué)習(xí)記錄

二、復(fù)現(xiàn)


1、SCTF 2020 Password Lock


參考鏈接:https://xuanxuanblingbling.github.io/iot/2020/07/08/stm32/

題目描述:

這是一個STM32F103C8T6 MCU密碼鎖 它具有4個按鍵,分別為1, 2, 3, 4. 分別對應(yīng)GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4 flag1格式為SCTF{正確的按鍵密碼} 輸入正確的密碼, 它將通過串口(PA9–TX)發(fā)送flag2

解題思路:

題目附件給出了一個Intel hex文件,并且給出了芯片信息我們可以確定程序的內(nèi)存布局和外設(shè)寄存器與內(nèi)存的對應(yīng)。而逆向的關(guān)鍵就是讀懂程序代碼的含義,接下來我們將逐步分析這個hex文件。

1. hex文件結(jié)構(gòu)

Intel hex文件格式由純文本構(gòu)成,其中包含了程序的加載地址和程序入口地址等信息,讀懂這些信息可以幫助我們快速定位程序的起始入口而不用在ida中進行配置。

  • 讀懂Intel hex文件

我們可以使用文本編輯器打開題目附件,其中關(guān)鍵信息如下所示:

:020000040800F2 ... ... :04000005080000ED02 :00000001FF
  • 程序加載地址為0x08000000

  • 程序入口地址為0x080000ED

  • 程序以:00000001FF結(jié)尾

  • 其余全是文件數(shù)據(jù)

2、內(nèi)存布局

查找芯片手冊的網(wǎng)站:https://www.alldatasheet.com/ 在里面我們可以找到STM32F103C8T6的手冊,第一頁發(fā)現(xiàn)我們需要的一些信息

  • Flash memory:32-to-128 Kbytes
  • SRAM:6-to-20 Kbytes

31頁的Memory Map可以讓我們更加直觀的了解到內(nèi)存的詳細布局

綜上所述我們得到了程序的完整內(nèi)存布局信息:

  • Flash Memory: 0x8000000 ~ 0x801FFFF (128K)
  • SRAM: 0x20000000 ~ 0x20004FFF (20K)
  • Peripherals: 0x40000000 ~ 0x40023400

3、IDA分析


經(jīng)過剛才的分析我們了解了程序的內(nèi)存布局,其中Flash段除了包含代碼,還有中斷向量表。Periphers段中的寄存器是我們在逆向過程中需要對齊有大體了解。而對于hex文件的分析我們了解到除了加載地址和入口地址,其他的所有內(nèi)容都不在hex文件中,所以我們需要手動配置這些內(nèi)存布局信息來告訴IDA怎么識別。 打開ida工具,根據(jù)剛才的手冊中我們可以查到芯片是arm32 Armv7-M架構(gòu),如下圖所示進行配置選擇然后單擊ok

可以看到已經(jīng)能識別出一部分函數(shù),其中start函數(shù)的地址與我們分析hex文件結(jié)構(gòu)時找到的程序入口地址相同。

如果hex文件中沒有給出入口地址信息我們也可以通過尋找RESET中斷處理函數(shù)來確定程序入口函數(shù)。其中RESET中斷函數(shù)的地址可以在STM32中文參考手冊V10.pdf中找到相關(guān)信息


參考 STM32 中斷向量表的位置 、重定向 中我們可以了解到在中斷向量表中RESET的地址0x8000004的地址是固定的,而可變的是程序的加載地址。我們跳轉(zhuǎn)到0x8000004這個地址上,按鍵盤D鍵將上面的數(shù)據(jù)分成4字節(jié)形式找到reset的地址為0x8000101

跳轉(zhuǎn)到RESET中斷處理函數(shù),存在兩次跳轉(zhuǎn)。第一次跳轉(zhuǎn)到nullsub_1上并將下一條指令地址放入LR寄存器,nullsub_1函數(shù)的作用是跳回LR寄存器中的地址,所以第一跳沒有意義。第二次跳轉(zhuǎn)就是我們的start地址,所以完全可以利用此方式定位到程序的入口地址。?

一直跟著入口地址走就能找到這個程序的main函數(shù)所在,但是進來之后可以發(fā)現(xiàn)左邊這一大片紅色的標(biāo)記,觀察這些紅色區(qū)域其實就是IDA沒有識別的地址,也就是我們之前分析內(nèi)存布局需要添加的內(nèi)存段。

我們在IDA中新建Segment,如下圖所示:?

這時只要我們再次點擊F5即可讓這些紅色的標(biāo)識變成正常識別的內(nèi)存了

4、修復(fù)中斷向量表

使用IDApython恢復(fù)程序入口地址之前的信息

for i in range(0x8000000,0x80000eb,1): del_items(i) for i in range(0x8000000,0x80000eb,4): create_dword(i)

修復(fù)完成后我們觀察這里面的地址,會發(fā)現(xiàn)有很多重復(fù)的地址0x800016D,跟進去會發(fā)現(xiàn)這些地址中沒有定義函數(shù)功能。繼續(xù)查看中斷向量表會發(fā)現(xiàn)下面幾個不同的內(nèi)存地址

參考 STM32中文參考手冊V10.pdf中的內(nèi)容我們可以查找到這些就是EXTI的中斷處理函數(shù)地址

  • stm32-EXTI

跟進這些函數(shù)地址會發(fā)現(xiàn)IDA并沒有將其識別為函數(shù),所以我們先在函數(shù)起始地址處按P鍵,然后進行反匯編即可看到這些中斷處理函數(shù),這里我以EXTI_4的中斷處理函數(shù)為例來簡單介紹一下這些中斷處理函數(shù)的功能。

int EXTI_4() {int result; // r0EXTI_LINE = 16;switch ( sum ){case 1:unk_20000006 = 116;return sum++ + 1;case 2:unk_20000010 = 95;return sum++ + 1;case 4:unk_2000000E = unk_20000001;return sum++ + 1;default:result = 0;sum = 0;break;}return result; }

程序一開始先設(shè)置了中斷/事件線,EXTI_4的中斷/事件線為0x10,然后使用一塊內(nèi)存(這里記作sum)來作為累加數(shù)的保存位置。我們可以看到當(dāng)sum中的值為1、2、4時sum的值會+1,如果不是的話則會重新開始。所以我們可以判斷出1、2、4就是EXTI_4出現(xiàn)在密碼中的位數(shù),同理其他的三個按鈕也是一樣的,通過這些順序我們可以得到最終的flag為flag{1442413},并且我們可以發(fā)現(xiàn)在main函數(shù)中程序先模擬輸入了一次密碼,通過將上面的值與EXTI_LINE進行對應(yīng)也能得到flag值。

2、2021 HWS 入營賽-STM32


經(jīng)過了上一題的入門接下來我們再來一道題目練習(xí)一下,打開IDA類型選擇小段arm32,架構(gòu)選擇ARMv7-M架構(gòu)。

接下來設(shè)置程序的加載地址和讀取地址設(shè)置為0x8000000,加載地址是指IDA加載的分析地址是多少,而Input File是指固件要從什么位置開始加載,設(shè)置好以后我們點擊OK完成設(shè)置。?

進入以后會發(fā)現(xiàn)IDA沒有識別出任何函數(shù),不用擔(dān)心我們可以通過定位reset的中斷處理來找到main函數(shù)的位置。將0x8000004地址處的字節(jié)變成4字節(jié),得到reset中斷處理函數(shù)地址0x8000101。?

?

可以發(fā)現(xiàn)地址的結(jié)尾是奇數(shù)位,在arm中這代表了thumb模式。我們可以在0x8000101地址按下C鍵即可生成代碼?

一直跟著程序流走我們就能找到main函數(shù)所在位置sub_80003C0,并且在其中發(fā)現(xiàn)了需要逆向的函數(shù)sub_8000314

_BYTE *sub_8000314() {_BYTE *v0; // r4char *v1; // r5int v2; // r6char v3; // t1v0 = (_BYTE *)sub_80003F0(48);v1 = &byte_8000344;v2 = 0;while ( v2++ != 0 ){v3 = *v1++;*v0++ = (v3 ^ 0x1E) + 3;sub_8000124(v1);}return v0; }

?寫出解題腳本即可獲得flag值

li = [0x7D, 0x77, 0x40, 0x7A, 0x66, 0x30, 0x2A, 0x2F, 0x28, 0x40, 0x7E, 0x30, 0x33, 0x34, 0x2C, 0x2E, 0x2B, 0x28, 0x34, 0x30, 0x30, 0x7C, 0x41, 0x34, 0x28, 0x33, 0x7E, 0x30, 0x34, 0x33, 0x33, 0x30, 0x7E, 0x2F, 0x31, 0x2A, 0x41, 0x7F, 0x2F, 0x28, 0x2E, 0x64] print(''.join(chr((i ^ 0x1E) + 3) for i in li))

原創(chuàng)稿件征集

征集原創(chuàng)技術(shù)文章中,歡迎投遞

投稿郵箱:edu@antvsion.com

文章類型:黑客極客技術(shù)、信息安全熱點安全研究分析等安全相關(guān)

通過審核并發(fā)布能收獲200-800元不等的稿酬。

靶場實操,戳“閱讀原文”?

總結(jié)

以上是生活随笔為你收集整理的stm32逆向入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。