1 PAC
AMR64
提供了PAC
(Pointer Authentication Code)機制。
所謂PAC
,簡單來說就是使用儲存在晶片硬體上的「金鑰」,一個「上下文」,與「指標地址」進行加密計算,得出一個「簽名」,將這個「簽名」寫入指標的高bit
上。
計算出來的「簽名」之所以可以寫入指標的高bit
,是因為在實際使用中,並不是所有指標64bit
都會被使用,通常高bit
都會被保留用來做其他用途。
如果在程式執行過程中,有人惡意的修改了指標地址,在後面將簽名後的指標地址,作用於驗證指令,就會報錯。
驗證過程和計算簽名過程一樣,只是比較前後計算的簽名值是否一樣。如果驗證成功,簽名就會從高bit
上移除。
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
的高bit
在PAC
後發生了變化。
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*
指令一樣。