一文搞懂 ARM 64 系列: PACISB

chaoguo1234發表於2024-11-13

1 PAC

AMR64提供了PAC(Pointer Authentication Code)機制。

所謂PAC,簡單來說就是使用儲存在晶片硬體上的「金鑰」,一個「上下文」,與「指標地址」進行加密計算,得出一個「簽名」,將這個「簽名」寫入指標的高bit上。

image

計算出來的「簽名」之所以可以寫入指標的高bit,是因為在實際使用中,並不是所有指標64bit都會被使用,通常高bit都會被保留用來做其他用途。

image

如果在程式執行過程中,有人惡意的修改了指標地址,在後面將簽名後的指標地址,作用於驗證指令,就會報錯。

驗證過程和計算簽名過程一樣,只是比較前後計算的簽名值是否一樣。如果驗證成功,簽名就會從高bit上移除。

image

2 指令語法

PACIBSP

3 指令語義

上面指令對函式返回地址進行PAC,也就是對X30的值進行PAC,或者說對LR暫存器的值進行PAC

PAC過程中,有2種金鑰,一種是金鑰A,另一種是金鑰B

指令PACIBSP中的B就代表使用金鑰B,同時SP表示「上下文」使用的是SP暫存器的值。

下面是一個執行PACIBSP後,X30的值變化的例子:

// PAC 前
(lldb) p/x $x30
(unsigned long) 0x000000010817f7bc

// PAC 後
(lldb) p/x $x30
(unsigned long) 0x3f57fc010817f7bc

從上面的輸出可以看到,X30的高bitPAC後發生了變化。

4 同類指令

4.1 PACIB

PACIB <Xd>, <Xn|SP>

金鑰: 金鑰B

上下文: Xn暫存器的值或者SP暫存器的值。

指標地址: Xd暫存器的值

4.2 PACIB1716

PACIB1716

金鑰: 金鑰B

上下文: 暫存器X16的值。

指標地址: 暫存器X17的值。

4.3 PACIBZ

PACIBZ

金鑰: 金鑰B

上下文: 0

指標地址: X30暫存器或者說LR暫存器的值。

4.4 PACIZB

PACIZB <Xd>

金鑰: 金鑰B

上下文: 0

指標地址: 暫存器Xd的值。

4.5 金鑰 A 指令

指令PACIASP PACIA PACIA1716 PACIAZ PACIZA除了使用金鑰A進行PAC之外,其它都與對應的PACIB*指令一樣。

相關文章