这节课听的很懵,记得也没有很好,不建议看!!
1.ROP
绕过NX,Return Oriented Programming
主要思想是:在栈缓冲溢出的基础上,利用程序中已有的小片段gadgets,来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓gadgets就是以ret结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。、
之所以称之为ROP,是因为核心在于利用了指令集中的ret指令,改变了1指令流的执行顺序。
ROP攻击一般得满足如下条件:
1.程序存在栈溢出,并且可以控制返回地址。
2.可以找到满足条件的gadgets以及相应的gadgets地址
如果gadgets每次的地址是不固定的,那我们就需要想办法动态获取对应地址了。
2.ret2text
控制程序执行程序本身已有的代码(.text),其实,这种攻击方式是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码(gadgets),这就是我们所要说的ROP。
32位传参规则:system地址+(sys)返回地址+ 参数
char buf;//[esp+0h][ebp-88h]
payload:
64位
rdi指向binsh
pop rdi; ret;
ropper 寻找gadget
ropper --file name --search "pop rdi"
ROPgadget也可以找
ROPgadget --name inndy_rop | grep "int 0x80"
会给出返回地址
exp
3.ret2shellcode:
4.ret2syscall
例子题目是静态编译的
控制程序执行系统调用,获取shell
view-> open subviews -> strings
ctrl+f
gets 函数读到回车 (0x0A)
由于静态编译
,所以程序存在int 0x80 可以使用中断调用系统函数
read(1,bss+0x100,8) 读入/bin/sh
execve(bss+0x100,0,0) getshell
ropper --file name --search "int 0x80"
5.ret2libc