Arm64彙編:BFXIL指令

996.icu LICENSE

  • 問題背景
  • 解決方法
  • 總結

閱讀之前注意:

本文閱讀建議用時: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網站搜索指令瞭解意思後,即可復現。

如果本文對你有幫助,不如請我一罐可樂吧 🎃
在這裏插入圖片描述

發佈了49 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章