标题: endbr64指令用途 作者: janw 创建: 2021-09-17 15:49 链接: https://scz.617.cn/misc/202109171549.txt 参看 What does the endbr64 instruction actually do - [2019-07-05] https://stackoverflow.com/questions/56905811/what-does-the-endbr64-instruction-actually-do $ objdump -j .text --disassemble=readline /usr/bin/bash | less ... 00000000000d5690 : d5690: f3 0f 1e fa endbr64 d5694: 41 54 push %r12 d5696: 53 push %rbx endbr64、endbr32指令是Intel CET(Control-Flow Enforcement Technology)技术的 一部分,endbr64是"End Branch"的意思。CET的出场是为了对付ROP、JOP、COP攻击 技术。据说GCC 8缺省在函数入口放置endbr64指令。endbr64指令的机器码在不支持 CET的老版CPU中视作nop指令。 下面有两个函数,some_function通过函数指针间接调用check_login -------------------------------------------------------------------------- some_function: mov rax, qword [vtable+8] call rax ... -------------------------------------------------------------------------- check_login: endbr64 ... authenticated: mov byte [is_admin], 1 ... ret -------------------------------------------------------------------------- a) 正常流程 some_function从虚函数表中获取check_login地址,间接调用。对于所有间接调用, CET状态机从IDLE状态转移至WAIT_FOR_ENDBRANCH状态,检查当前PC所在指令,若是 endbr64则继续,与nop无二。CET状态机转移至IDLE状态。 b) 攻击流程 攻击者设法修改了虚函数表中的函数指针,假设[vtable+8]现在指向authenticated。 发生间接调用,CET状态机转移至WAIT_FOR_ENDBRANCH状态,检查当前PC所在指令, 是mov而非endbr64,CPU触发Control Protection Exception (#CP),攻击流程中止。 若未启用CET,攻击者直接获取管理员权限。 简而言之,启用CET后,间接转移(call/jmp/ret)的目标地址处必须是endbr64指令, 该指令正常情况下只出现在函数入口,从而对抗转移到函数中部、指令中部的各种非 正常转移。显然,CET有效缓解了ROP、JOP、COP攻击效果,但不能完全阻止它们。