39、利用ProxyCFI掌控代码指针的力量

利用ProxyCFI掌控代码指针的力量

1. 代码指针与多分支示例

在程序中,间接调用和返回等操作常常涉及多分支跳转。例如在函数 foo() 中对 bar() baz() 的间接调用,通过多分支实现:当遇到代理 $7743d2ff 时跳转到 bar() ,当指针代理为 $1f324a19 时跳转到 baz() 。而且, bar() baz() 函数的返回操作同样通过多分支实现。

高级控制流攻击,如控制流弯曲,会利用从一个函数上下文复制的代码指针,在不违反控制流完整性(CFI)约束的情况下跳转到其他函数地址,从而破坏 CFI。而指针代理被唯一分配给控制流边(即源和目标的函数),函数 X 的指针代理对函数 Y 毫无意义。这一强大特性在不影响指针代理可用性的同时,能抵御大量高级控制流攻击。例如在图 1 中, bar() baz() 函数虽返回同一地址(标签 done ),但使用不同的指针代理,若相互披露并使用对方的指针代理返回,会导致多分支跳转不匹配,引发违规。为防止指针代理被伪造,所有指针代理值按函数定义,并在程序加载时由验证器重新随机化。

2. 构建使用指针代理的代码

2.1 强化间接跳转

构建使用指针代理的代码,需将程序中使用代码指针的地方全部替换为指针代理。对于所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值