代码重用的图灵完备性

 

代码重用的概念在早期被称为返回导向式编程(return-oriented programing, 简称ROP)方法, 说明其具备程序语言一样的能力[1213].为了说明特定的代码重用方式在图灵机模型下能够进行任何操作, 通常需要证明该代码重用方式的图灵完备性(turing completeness).一旦证明该代码重用攻击方法是图灵完备的, 则从理论上说明攻击者基于此种代码重用攻击模型能够实现任意攻击目的的程序行为[13-15].

Shacham在2007年首次证明了基于ROP的代码重用方式是图灵完备的[13].证明代码重用方式具有图灵完备性, 需证明该重用方法下的gadget能够实现如下功能:内存读/写、数据处理、控制流跳转、系统调用和函数调用.下面结合kernel32.dll(Windows 32, X86) 中的gadget(ROP gadgets search: #)分别进行描述.

(1) 内存读/写

一般情况下, 内存读写主要有3种形式:加载常量到寄存器(load cons)、从指定内存加载数据到寄存器(load mem)、向指定内存写入数据(write mem).故要证明具备内存读/写能力, 需存在上述3种类型的gadget:通过类似于pop REG的gadget即可实现从栈到寄存器的常量加载; 在X86下, 通过mov指令可实现从内存加载数据到寄存器, 如“mov eax, [ebp+0x10]; pop ebp; ret 0xc”; 同理, 内存写入gadget形如“mov [ebx+2], eax; ret”.

(2) 数据处理

若要具备完整的数据处理能力, 则需要具有算术运算和逻辑运算的gadget.其中, 算术运算gadget需要包括用于进行算数加法、减法、乘法和除法的4类gadget, 而逻辑运算包括能够进行逻辑与、或、非和异或这4类gadget.表 1给出了相应的gadget示例.

Table 1 Gadgets for data processing (arithmetic operation and logic operation)表 1 数据处理gadgets示例(算数运算和逻辑运算)

(3) 控制流转移

控制流转移分为直接跳转(unconditional-jump)和条件跳转(conditional-jump).对于前者, 使用函数末尾类似于“ret”的返回指令进行任意目标的无条件跳转.对于条件跳转则较为复杂, Shacham在文献[13]中给出了间接实现条件跳转的一种思路.

a) 使用指令neg对特定值进行求补码运算, 操作数是否为0可以通过进位标志CF(carry flag)体现出来.由neg指令特性可知:如果操作数为0, 则CF为0;否则, 操作数为非0, CF被置为有效, 即CF值为1.

b) CFb jf代码重用的图灵完备性位反映了条件判定结果, 通过使用移位指令或者带进位的加法即可取出CF值.一种简单的办法是使用类似于xor ecx, ecx; adc cl, cl; ret的指令片段将CF的值放入寄存器ecx.

c) 将ecx向左移位2n位, ecx的值则为0或4n, 其中, 4n是两个分支目标之间的offset.只需要通过gadget序列实现功能mov eax, offset; add esp, eax; ret, 则实现由步骤a)中的特定值来决定最终的跳转目标的功能, 即条件跳转.

上述步骤中的后两步可能需要其他多个基础gadget的操作来完成, 但该思路最终能够实现条件跳转.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值