今天,是rop的介绍与编写。
什么是rop呢?
上一次我学习了一种栈溢出的思路:pop rdi ret ;/bin/sh+字符串地址;system。
像这种形式的传参和调用,或者说这种编程方法,就叫做rop。
rop,是英文返回导向编程的简称,实际上就是程序中以一大堆ret的拼凑来完成代码逻辑。所以,这些ret的如何拼凑?(编写?)
以system(“/bin/sh”)为例:
我们需要做的,是将rdi这个地址改写为/bin/sh的字符串地址,然后call system。
如果我们不能执行shellcode,那么我们可以通过栈来修改参数。
pop rdi ret ;/bin/sh addr。
那么如何call?我们使用ret。
综上,我们构造的payload是:
填充区(用于填充缓冲区buf的那部分无效数据)+pop rdi ;ret +/bin/sh +system
比喻一下,rop就像是搭积木,一小部分一小部分的拼凑,基本上只会用到栈。
这些“积木”,我们称之为gadget。
怎么找到gadget呢?这里就要用到两个工具:ropper和ropgadgets。
简单说一下ropgadgets 的使用:
指令:ROPgadgets --(想找的二进制文件)。
当分析一些内核的时候,ropgadgets可能就会比较慢。
接下来是ropper。
使用:ropper --file file的名字。
比如这样,执行后很快就会将gadget打印出来:
正常情况:
好了,今天到这。