- 問題背景
- 解決方法
- 總結
閱讀之前注意:
本文閱讀建議用時:10min
本文閱讀結構如下表:
項目 | 下屬項目 | 測試用例數量 |
---|---|---|
問題背景 | 無 | 0 |
解決方法 | 無 | 1 |
總結 | 無 | 0 |
問題背景
復現一套加密算法時,遇到了BFXIL指令。
IDA中顯示情況如下:
BFXIL W9, W16, #2, #2
IDA使用Fn+F5操作得到僞代碼如下:
v4 = v4 | ((v8 & 0xFC) >> 2) & 3;
其中v4就是w9,(v8 & 0xFC)這個整體就是w16,定義如下:
unsigned int v4; // w9
因爲不太瞭解這條指令,所以也不知道解析的僞代碼是不是正確的。
解決方法
IDA這樣解析出來的僞代碼是錯誤的。
先在armDeveloper搜索這條指令,知道了這是無符號位域提取指令。
有2種語法:
BFXIL Wd, Wn, #lsb, #width ; 32-bit
BFXIL Xd, Xn, #lsb, #width ; 64-bit
意思是:從Wn寄存器的第lsb位開始,提取width位,替換Wd寄存器的最低width位,剩餘高位不改變。
下面分析我們的代碼:
BFXIL W9, W16, #2, #2
可以知道是從w16寄存器的第2位開始,提取2位,替換w14寄存器的最低2位,然後w14寄存器剩餘高位不改變。這不就是先把w16寄存器先整體右移2位,然後w16&3從而保留最低2位,然後再用w14和前面“w16&3”的結果進行“|”操作嗎?因此在IDA解析出來的如下結果:
v4 = v4 | ((v8 & 0xFC) >> 2) & 3;
做進一步修正得到以下結果:
v4 = v4 | (((v8 & 0xFC) >> 2) & 3);
測試後修正代碼是能正確工作的!可以知道IDA在有些代碼的解析還是會出錯。
總結
Arm64彙編——BFXIL指令的意思是從Wn寄存器的第lsb位開始,提取width位,替換Wd寄存器的最低width位,剩餘高位不改變。在逆向過程中遇到這種指令,在armDeveloper網站搜索指令瞭解意思後,即可復現。
如果本文對你有幫助,不如請我一罐可樂吧 🎃