From 088456986b6acd52fb16b3544d374049cea61876 Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Tue, 25 Aug 2026 13:41:03 -0700 Subject: [PATCH] [aarch64] Disassemble and lift instructions in FEAT_PAuth_LR --- arch/arm64/arch_arm64.cpp | 24 +++++ arch/arm64/arm64test.py | 98 ++++++++++++++++++++- arch/arm64/disassembler/decode_scratchpad.c | 31 ++++++- arch/arm64/il.cpp | 72 +++++++++++++++ arch/arm64/il.h | 6 ++ 5 files changed, 229 insertions(+), 2 deletions(-) diff --git a/arch/arm64/arch_arm64.cpp b/arch/arm64/arch_arm64.cpp index 0f11a40de2..5e1383bb58 100644 --- a/arch/arm64/arch_arm64.cpp +++ b/arch/arm64/arch_arm64.cpp @@ -399,6 +399,10 @@ class Arm64Architecture : public Architecture case ARM64_RET: case ARM64_RETAA: case ARM64_RETAB: + case ARM64_RETAASPPC: + case ARM64_RETABSPPC: + case ARM64_RETAASPPCR: + case ARM64_RETABSPPCR: result.AddBranch(FunctionReturn); break; case ARM64_SVC: @@ -961,6 +965,14 @@ class Arm64Architecture : public Architecture return "__autia"; case ARM64_INTRIN_AUTIB: return "__autib"; + case ARM64_INTRIN_AUTIA2: + return "__autia2"; + case ARM64_INTRIN_AUTIB2: + return "__autib2"; + case ARM64_INTRIN_PACIA2: + return "__pacia2"; + case ARM64_INTRIN_PACIB2: + return "__pacib2"; case ARM64_INTRIN_ISB: return "__isb"; case ARM64_INTRIN_WFE: @@ -993,6 +1005,8 @@ class Arm64Architecture : public Architecture return "SystemHintOp_CSDB"; case ARM64_INTRIN_HINT_BTI: return "SystemHintOp_BTI"; + case ARM64_INTRIN_HINT_PACM: + return "SystemHintOp_PACM"; case ARM64_INTRIN_SEV: return "__sev"; case ARM64_INTRIN_SEVL: @@ -1157,6 +1171,12 @@ class Arm64Architecture : public Architecture case ARM64_INTRIN_PACIA: // reads , case ARM64_INTRIN_PACIB: // reads , return {NameAndType(Type::IntegerType(8, false)), NameAndType(Type::IntegerType(8, false))}; + case ARM64_INTRIN_AUTIA2: // reads , modifier, modifier2 + case ARM64_INTRIN_AUTIB2: // reads , modifier, modifier2 + case ARM64_INTRIN_PACIA2: // reads , modifier, modifier2 + case ARM64_INTRIN_PACIB2: // reads , modifier, modifier2 + return {NameAndType(Type::IntegerType(8, false)), NameAndType(Type::IntegerType(8, false)), + NameAndType(Type::IntegerType(8, false))}; case ARM64_INTRIN_TLBI: // reads , return { NameAndType("tlbi_op", Confidence>(Type::EnumerationType(this, get_tlbi_op_enum(), 4, false), BN_FULL_CONFIDENCE)) @@ -1206,6 +1226,10 @@ class Arm64Architecture : public Architecture case ARM64_INTRIN_PACIA: // writes case ARM64_INTRIN_PACGA: // writes case ARM64_INTRIN_PACIB: // writes + case ARM64_INTRIN_AUTIA2: // writes + case ARM64_INTRIN_AUTIB2: // writes + case ARM64_INTRIN_PACIA2: // writes + case ARM64_INTRIN_PACIB2: // writes case ARM64_INTRIN_XPACD: // writes case ARM64_INTRIN_XPACI: // writes case ARM64_INTRIN_CNT: // writes diff --git a/arch/arm64/arm64test.py b/arch/arm64/arm64test.py index 47ae6c8c60..e1e2c80aae 100755 --- a/arch/arm64/arm64test.py +++ b/arch/arm64/arm64test.py @@ -78,6 +78,22 @@ # retab (example of encoding: RETAB_64E_branch_reg) (b'\xFF\x0F\x5F\xD6', 'LLIL_RET(LLIL_REG.q(lr))', ATTR_PTR_AUTH), + # RETURN FROM SUBROUTINE, WITH POINTER AUTHENTICATION AGAINST SP AND PC (FEAT_PAuth_LR) + # the operand is part of the authentication modifier rather than the address returned to, which + # is always lr + # retaasppc