ROP(Return Oriented Programming)

来源:互联网 发布:nznd男团 知乎 编辑:程序博客网 时间:2024/06/01 09:26

ROP

在ret2libc中提到了ROP,今天在此详细记录
在YouTube看rop的视频时,视频制作者提及这项技术是Hovav Shacham 于2007年首先展示出来,很是震惊,现在已经是2017年了,10年之内技术又进步到哪里了呢?还望自己勤勉学习,能早一日看见顶峰

rop的起源

每一项技术的出现,背后必定有存在的意义,在ret2libc中,我们提及这是为了对抗DEP/NX即W^N技术而产生。
想一想如果一个函数不会被正常的程序使用,那又为什么要加载呢?如果在libc中移除system()又会怎么样?

esp就是新的eip

回想一下在ret2libc中我们做过的事情,在ret处覆盖为system(),在其之上覆盖为exit()地址,这样在执行完system()之后紧接着执行的就是exit(),这不就是一条我们能控制的执行流吗?假如我们能控制好覆盖后的地址,确保每一次执行完都能ret,那么esp就能成为我们的新eip指针~

gadgets的来源

一个精致小巧的工具
https://github.com/packz/ropeme
rop思想的精髓就在于覆盖的内容是精巧设计的而不仅仅是覆盖了ret-addr,在每一次的ret之后返回的地址实际就是下一次的eip指针,以以下例子举例
esp
这里我们把ret-addr及之后的位置进行覆盖,那么接下来会执行的指令
pop eip 或者是 ret
就会帮我们把eip指向0x0808ad33这个位置,继续执行

pop eaxret

就会把0x5赋值给eax,然后ret~我们就又一次跳转到了我们指定好的一个位置0x07ff3a42
这就是rop

ROP的完备性

rop真的能完成所有的工作吗?这个问题已经被证明,rop是图灵完备的~所以放心大胆的去做吧

更详细的参考资料

1.完整的rop利用 Return-Oriented-Programming-By Saif El-Sherei

2.详尽的ROP介绍 Return-oriented Programming:
Exploitation without Code Injection-Erik Buchanan, Ryan Roemer, Stefan Savage, Hovav Shacham
University of California, San Diego

0 0
原创粉丝点击