返回导向编程

一、ret2syscall(返回到系统调用)

1.系统调用

  • 操作系统提供给用户的编程接口
  • 是提供访问操作系统所管理的底层硬件的接口
  • 本质上是一些内核函数代码,以规范的方式驱动硬件
  • x86通过int 0x80指令进行系统调用、amd64通过syscall指令进行系统调用

2.举例:

  • 在进行系统调用时,eax中保存的是系统调用号,ebx,ecx..保存系统调用时所需的参数。
  • write的系统调用号为4,execve的系统调用号为11,作用为执行第一个参数的命令。
  • 系统调用的本质就是一段指令

3.ROP(返回导向编程)

程序中并没有一段连续的汇编代码去实现系统调用,而rop可以将分离的代码片段经过组合达到相同的效果

(1)ret2syscall

篡改栈帧上自返回地址开始的一段区域为一系列gadget的地址,最终完成目标函数的调用

如果文件开启了NX保护,那直接在栈上写入shellcode以获取shell的攻击手法变得难以执行,除了寻找其他可写可执行的段(bss)以期写入shellcode的方法外,还可以考虑利用文件中已有的gaget来改变某些寄存器或者某些变量的值,从而控制程序执行流。

ROP攻击一般需要满足一下条件

  • 程序存在溢出,并且可以控制返回地址
  • 可以找到满足条件的gagets和相应gagets的地址(静态链接的程序)

1.32位程序

对于32位程序我们需要eax寄存器来存储系统调用号,一般情况下,我们的思路是通过系统调用执行:execve('/bin/sh',null,null),这里需要注意传入的是/bin/sh的地址,然后通过gaget修改ebx,ecx,edx寄存器的值,最后进行系统调用(int 80 指令的地址)

2.64位程序

64位程序的传参方式和32位程序有所不同,若参数小于6个,参数传递利用的寄存器以此为:rdi,rsi,rdx,rcx,r8,r9,除此之外,系统调用号通过rax传递,最后进行系统调用(syscall指令的地址)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值