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()

 

posted @ 2020-03-17 20:51  An2i  阅读(495)  评论(0)    收藏  举报