【pwn学习】ROP(更新中)

什么是ROP?

ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程。

gadgets就是以ret结尾的指令序列。

ROP主要是针对NX保护而诞生的方法,NX开启后,难以直接向栈或者堆上注入代码,因此需要利用gadgets来构建可控的程序流。

前提条件

  • 程序存在溢出,且可以控制返回地址
  • 可以找到满足条件的gadgets以及gadgets地址。

几种不同的类型

1. ret2text

原理:利用程序中本身存在的危险函数,例如调用了system("/bin/sh"),通过栈溢出返回到system执行的位置。

前提条件

  • 开启了NX保护
  • 程序中存在可以直接利用的获取shell的危险函数

例题XCTF-pwn-新手区-003 解题记录


2. ret2shellcode

原理:利用栈溢出函数,返回到攻击人注入的shellcode处。shellcode注入的区域必须拥有可执行的的权限。

具体shellcode的编写参考之前写的这篇文章 【pwn学习】pwn中的简单shellcode

前提条件

  • 没有可以利用的危险函数
  • 未开启NX保护(存在满足RWX三个权限的区域)
  • 可以将shellcode注入到相应的区域

例题:ret2shellcode


3. ret2syscall

原理:控制程序执行系统调用,获取shell

应用程序调用系统调用的过程是:

  1. 把系统调用的编号存入 EAX;
  2. 把函数参数存入其它通用寄存器;
  3. 触发 0x80 号中断(int 0x80)。

execve(“/bin/sh”, 0,0)为例,在调用时,对应的汇编代码为

mov eax, 0xb ; execve对应的系统调用号是 11 即 0xb
lea ebx, [binsh_addr];
mov ecx, 0
mov edx, 0
int 0x80

实际上,如果把int 0x80看作一个函数,相当于执行了 int_80(execve, "/bin/sh", 0, 0),同时参数依次用eax,ebx,ecx,edx传递。

例题ret2Syscall


4. ret2libc

原理:ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system("/bin/sh"),故而此时我们需要知道 system 函数的地址

前提条件

  • 没有可以直接利用的危险函数
  • 开启了NX保护,也不能直接注入shellcode

例题-1: 简单难度

在程序中可以找到能利用的system 函数和/bin/sh字符串
XCTF-简单题-pwn-004
例题-2: 中等难度

ret2csu

ret2reg

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morphy_Amo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值