ROP攻击学习
ROP系统攻击
ROP全称为Return-oriented Programming(面向返回的编程)是一种基于代码复用技术的攻击,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。
特点:1.call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来;
2.jmp指令可以在不同的库函数甚至不同的库之间跳转。
ROP攻击有哪些:
1.ret2text(控制程序执行已有的代码)
像gets、scanf、strcpy、strcat等对输入长度没有限制的函数容易存在溢出漏洞。ret2text 即利用程序本身已有的的代码 (在.text段中),通过控制执行流到达某段代码(或函数)处以实现某种目的,大多是system()、exec()等可以getshell的函数地址处。
条件:存在溢出点,有system("/bin/sh")之类的函数
流程:寻找溢出点,计算偏移,覆盖到system("/bin/sh"),写exp。
缺点:必须依赖system("/bin/sh"),程序没有就get不到shell了。
2.ret2shellcode(控制程序执行shellcode)
通过写入shellcode,然后将返回地址覆盖为shellcode的地址,从而get shell。写入shellcode的地点看情况,如果能写入数据段最好,不能也可以写入到栈里保存。如果写入的内存空间不具备可执行权限就凉了。条件:无NX保护,需要自己写shellcode填充到堆栈
可以解决无system("/bin/sh")的问题。
3.ret2libc
ret2libc 即控制程序去执行 libc 中的函数,通常是覆盖返回地址为某个函数的 plt 表项处或者got表中函数真实地址处。此外,我们的覆盖数据中必须包含要执行函数的参数,才能确保libc库的函数正确执行。我们通常选择system()函数get shell时,经常需要解决"/bin/sh"字符串的问题,以及libc函数地址(got表中某项记录的地址)。
我们可以通过ROPgadget搜索程序中是否存在我们需要的字符串,如“ROPgadget --string "/bin/sh"”。
应对场景:开启NX保护(可写的内存区域不可执行,可执行的内存区域不可写)
4.ret2syscall(控制程序执行系统调用)
突破NX保护
pwntools关于shellcode部分运用
1.指定系统环境,context.arch = "i386/amd64"
2. s = asm(shellcode)
asm(""" 汇编代码""") 或者使用pwntool自动生成 asm( shellcraft.sh() )
3.p.sendline(s)
from pwn import * context(arch="i386(或者amd64)",os="linux",log_level="debug") //指定下环境,以方便shellcode生成知道是32位还是64位 p=process("./ret2shellcode") p.recv() offset=100 //输入的地址距离返回地址的间隔 shellcode=asm(shellcraft.sh()) //自动生成shellcode payload=shellcode.ljust(offset,'a')+p32(0xshellcode写入地址) //ljust()确保shellcode的长度为112个字节,不足自动填充‘a' p.sendline(payload) p.interactive()