1.Thumb指令集詳解
2.Thumb直接訪問的寄存器
3.Thumb指令集組成部分詳解
4.Thumb和arm狀態卻換
5.Thumb的常見應用場景shell
ARM處理器支持兩種指令集:ARM指令集和Thumb指令集。ide
ARM指令集指令長度爲32位,Thumb指令集指令長度爲16位。在16位外部數據總線寬度下,ARM處理器上使用Thumb指令的性能要比使用ARM指令的性能更好。性能
3.1.Thumb數據處理指令編碼
3.2.分支跳轉指令3d
3.3.寄存器加載存儲指令(單寄存器、多寄存器)調試
3.4.雜項指令code
SWI:軟中斷指令blog
指令格式以下:it
SWI immed_8 其中:immed_8 8 位當即數,值爲0~255 之間的整數。 SWI 指令舉例以下: SWI 1 ;軟中斷,中斷當即數爲0 SWI 0x55 ;軟中斷,中斷當即數爲0x55 使用SWI 指令時,一般使用如下兩種方法進行傳遞參數,SWI 異常中斷處理程序能夠提供相關的服務,這兩種方法均是用戶軟件協定。SWI 異常中斷處理程序要經過讀取引發軟中斷的SWI 指令。以取得8 位當即數。 (A)指令中8 位的當即數指定了用戶請求的服務類型,參數經過用寄存器傳遞。 MOV R0,#34 ;設置子功能號爲34 SWI 18 ;調用18 號軟中斷 (B)指令中的8 位當即數被忽略,用戶請求的服務類型由寄存器R0 的值決定,參數經過其它的通用寄存器傳遞。 MOV R0,#18 ;調用18 號軟中斷 MOV R1,#34 ;設置子功能號爲34 SWI 0
•ARM/Thumb之間的狀態切換是經過一條專用的轉移交換指令BX來實現的class
彙編格式: BX{} Rm
功能: BX 指令跳轉到指令中所指定的目標地址,並實現狀態的切換。 Rm 是一個表達目標地址的寄存器。當Rm 中的最低位Rm[0] 爲 1 時,強制程序從ARM 指令狀態跳到Thumb 指令狀態;當 Rm 中的最低位Rm[0]爲0 時,強制程序從Thumb 指令狀態跳到ARM 指令狀態。
BX 指令示例
CODE32 ;ARM 程序段,32 位編碼 arm1 ADR R0,thumb1+1 ;把thumb1 所在地址賦給R0 ,末位R0[0] 置1 ,要跳轉THUMB 指令集 MOV LR,PC ;設置返回地址 BX R0 ;跳轉 ADD R1,R2,#2 ;返回地址處,第4 條指令 CODE16 ;THUMB 程序段, 16 位編碼 thumb1 ADD R1,R3,#1 ;THUMB 程序 BX LR ;跳轉到返回地址處,執行第4 條指令
以上示例分析:說明了帶狀態切換的子程序調用和返回結構,ARM 程序段執行MOV LR,PC 語句時將返回地址保存到了LR 寄存器中。 執行到BX 語句時 ,PC 指向下一個要執行的語句,此時PC(R15) 中的值爲下一個語句ADD 指令所在的地址,並根據R0 中的bit[0] 實現了由ARM 狀態切換到Thumb 狀態。 從而調用Thumb 子程序,子程序調用完後使用BX LR 指令,從而實現了子程序調用的返回並切換到ARM 狀態。
•在ida中識別Thumb指令和ARM指令的方法
•CODE32表示的採用ARM彙編指令,CODE16表示採用的是THUMB彙編指令。
•Thumb彙編的主要應用場景:逆向調試So文件的時候,編寫ARM的shellcode代碼的時候。
•如下是arm的shellcode的應用