endbr64指令用途
2022-11-17 23:59:55 Author: mp.weixin.qq.com(查看原文) 阅读量:47 收藏

作者: janw
创建: 2021-09-17 15:49
http://scz.617.cn:8/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 <readline@@Base>:
   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攻击效果,但不能完全阻止它们。


文章来源: https://mp.weixin.qq.com/s?__biz=MzUzMjQyMDE3Ng==&mid=2247486316&idx=1&sn=5cd9dec24a306db39c61e1ff5ccb1921&chksm=fab2c853cdc54145883ff156ce679ab4a235b798c191990f50f27b22a99211fd14b37afd0992#rd
如有侵权请联系:admin#unsafe.sh